Module: wine Branch: master Commit: 9c76a0b37afd3650b01784dbba61fdf3fad90808 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c76a0b37afd3650b01784dbba...
Author: Mike McCormack mike@codeweavers.com Date: Thu Jan 25 19:18:18 2007 +0900
msi: Implement IDispatch->CreateInstance() for the msi server dll.
---
dlls/msi/msi_main.c | 37 +++++++++++++++++++++++++++++-------- 1 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 48cfd15..dc9d7f4 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -80,8 +80,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
typedef struct tagIClassFactoryImpl { const IClassFactoryVtbl *lpVtbl; + HRESULT (*create_object)( IUnknown*, LPVOID* ); } IClassFactoryImpl;
+static HRESULT create_msiserver( IUnknown *pOuter, LPVOID *ppObj ) +{ + FIXME("\n"); + return E_FAIL; +} + static HRESULT WINAPI MsiCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid,LPVOID *ppobj) { @@ -115,9 +122,18 @@ static HRESULT WINAPI MsiCF_CreateInstan LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IUnknown *unk = NULL; + HRESULT r;
- FIXME("%p %p %s %p\n", This, pOuter, debugstr_guid(riid), ppobj); - return E_FAIL; + TRACE("%p %p %s %p\n", This, pOuter, debugstr_guid(riid), ppobj); + + r = This->create_object( pOuter, ppobj ); + if (SUCCEEDED(r)) + { + r = IUnknown_QueryInterface( unk, riid, ppobj ); + IUnknown_Release( unk ); + } + return r; }
static HRESULT WINAPI MsiCF_LockServer(LPCLASSFACTORY iface, BOOL dolock) @@ -141,7 +157,7 @@ static const IClassFactoryVtbl MsiCF_Vtb MsiCF_LockServer };
-static IClassFactoryImpl Msi_CF = { &MsiCF_Vtbl }; +static IClassFactoryImpl MsiServer_CF = { &MsiCF_Vtbl, create_msiserver };
/****************************************************************** * DllGetClassObject [MSI.@] @@ -150,15 +166,20 @@ HRESULT WINAPI DllGetClassObject(REFCLSI { TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- if( IsEqualCLSID (rclsid, &CLSID_IMsiServer) || - IsEqualCLSID (rclsid, &CLSID_IMsiServerMessage) || + if ( IsEqualCLSID (rclsid, &CLSID_IMsiServerX2) ) + { + *ppv = (LPVOID) &MsiServer_CF; + return S_OK; + } + + if( IsEqualCLSID (rclsid, &CLSID_IMsiServerMessage) || + IsEqualCLSID (rclsid, &CLSID_IMsiServer) || IsEqualCLSID (rclsid, &CLSID_IMsiServerX1) || - IsEqualCLSID (rclsid, &CLSID_IMsiServerX2) || IsEqualCLSID (rclsid, &CLSID_IMsiServerX3) ) { - *ppv = (LPVOID) &Msi_CF; - return S_OK; + FIXME("create %s object\n", debugstr_guid( rclsid )); } + return CLASS_E_CLASSNOTAVAILABLE; }