Module: wine Branch: master Commit: 94edfde1d97071b9c4ed3f5ba3e0b043565a2db9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=94edfde1d97071b9c4ed3f5ba3...
Author: Mike McCormack mike@codeweavers.com Date: Thu Feb 8 17:20:55 2007 +0900
msi: Register the typelib.
---
dlls/msi/msi_main.c | 45 +++++++++++++++++++++++++++++++++++++++++---- dlls/msi/msipriv.h | 3 +++ dlls/msi/regsvr.c | 15 +++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 2d82091..a3dac7f 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -27,6 +27,7 @@ #include "winbase.h" #include "winreg.h" #include "shlwapi.h" +#include "oleauto.h" #include "msipriv.h"
#include "wine/debug.h" @@ -43,6 +44,8 @@ INSTALLUI_HANDLERW gUIHandlerW = NULL; DWORD gUIFilter = 0; LPVOID gUIContext = NULL; WCHAR gszLogFile[MAX_PATH]; +WCHAR msi_path[MAX_PATH]; +ITypeLib *msi_typelib = NULL; HINSTANCE msi_hInstance;
/* @@ -71,6 +74,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, msi_dialog_register_class(); break; case DLL_PROCESS_DETACH: + if (msi_typelib) ITypeLib_Release( msi_typelib ); msi_dialog_unregister_class(); msi_free_handle_table(); break; @@ -78,10 +82,38 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, return TRUE; }
-typedef struct tagIClassFactoryImpl { - const IClassFactoryVtbl *lpVtbl; - HRESULT (*create_object)( IUnknown*, LPVOID* ); -} IClassFactoryImpl; +static CRITICAL_SECTION MSI_typelib_cs; +static CRITICAL_SECTION_DEBUG MSI_typelib_cs_debug = +{ + 0, 0, &MSI_typelib_cs, + { &MSI_typelib_cs_debug.ProcessLocksList, + &MSI_typelib_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": MSI_typelib_cs") } +}; +static CRITICAL_SECTION MSI_typelib_cs = { &MSI_typelib_cs_debug, -1, 0, 0, 0, 0 }; + +ITypeLib *get_msi_typelib( LPWSTR *path ) +{ + EnterCriticalSection( &MSI_typelib_cs ); + + if (!msi_typelib) + { + TRACE("loading typelib\n"); + + if (GetModuleFileNameW( msi_hInstance, msi_path, MAX_PATH )) + LoadTypeLib( msi_path, &msi_typelib ); + } + + LeaveCriticalSection( &MSI_typelib_cs ); + + if (path) + *path = msi_path; + + if (msi_typelib) + ITypeLib_AddRef( msi_typelib ); + + return msi_typelib; +}
static HRESULT create_msiserver( IUnknown *pOuter, LPVOID *ppObj ) { @@ -89,6 +121,11 @@ static HRESULT create_msiserver( IUnknow return E_FAIL; }
+typedef struct tagIClassFactoryImpl { + const IClassFactoryVtbl *lpVtbl; + HRESULT (*create_object)( IUnknown*, LPVOID* ); +} IClassFactoryImpl; + static HRESULT WINAPI MsiCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid,LPVOID *ppobj) { diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index a89da66..b01bb27 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -525,6 +525,9 @@ typedef struct {
UINT msi_strcpy_to_awstring( LPCWSTR str, awstring *awbuf, DWORD *sz );
+/* msi server interface */ +extern ITypeLib *get_msi_typelib( LPWSTR *path ); + /* handle functions */ extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type); extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * ); diff --git a/dlls/msi/regsvr.c b/dlls/msi/regsvr.c index dca44e2..6aa73d1 100644 --- a/dlls/msi/regsvr.c +++ b/dlls/msi/regsvr.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#define COBJMACROS + #include "config.h"
#include <stdarg.h> @@ -31,6 +33,7 @@
#include "ole2.h" #include "olectl.h" +#include "oleauto.h"
#include "wine/debug.h"
@@ -650,6 +653,8 @@ static HRESULT register_msiexec(void) */ HRESULT WINAPI DllRegisterServer(void) { + LPWSTR path = NULL; + ITypeLib *tl; HRESULT hr;
TRACE("\n"); @@ -659,6 +664,16 @@ HRESULT WINAPI DllRegisterServer(void) hr = register_interfaces(interface_list); if (SUCCEEDED(hr)) hr = register_msiexec(); + + tl = get_msi_typelib( &path ); + if (tl) + { + hr = RegisterTypeLib( tl, path, NULL ); + ITypeLib_Release( tl ); + } + else + hr = E_FAIL; + return hr; }