Module: wine Branch: master Commit: 64eec8f9fac2893a351dd6d27a756c5c16bde07c URL: http://source.winehq.org/git/wine.git/?a=commit;h=64eec8f9fac2893a351dd6d27a... Author: Hans Leidekker <hans(a)codeweavers.com> Date: Fri Jul 23 09:43:27 2010 +0200 msi: Register dlls directly in the SelfRegModules and SelfUnregModules actions. --- dlls/msi/action.c | 82 ++++++++++++++++++---------------------------------- 1 files changed, 29 insertions(+), 53 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index a5c6654..bb559c0 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -4333,23 +4333,38 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package ) return ERROR_SUCCESS; } +static void register_dll( const WCHAR *dll, BOOL unregister ) +{ + HMODULE hmod; + + hmod = LoadLibraryExW( dll, 0, LOAD_WITH_ALTERED_SEARCH_PATH ); + if (hmod) + { + HRESULT (WINAPI *func_ptr)( void ); + const char *func = unregister ? "DllUnregisterServer" : "DllRegisterServer"; + + func_ptr = (void *)GetProcAddress( hmod, func ); + if (func_ptr) + { + HRESULT hr = func_ptr(); + if (FAILED( hr )) + WARN("failed to register dll 0x%08x\n", hr); + } + else + WARN("entry point %s not found\n", func); + FreeLibrary( hmod ); + return; + } + WARN("failed to load library %u\n", GetLastError()); +} + static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPCWSTR filename; - LPWSTR FullName; MSIFILE *file; - DWORD len; - static const WCHAR ExeStr[] = - {'r','e','g','s','v','r','3','2','.','e','x','e',' ','\"',0}; - static const WCHAR close[] = {'\"',0}; - STARTUPINFOW si; - PROCESS_INFORMATION info; - BOOL brc; MSIRECORD *uirow; - memset(&si,0,sizeof(STARTUPINFOW)); - filename = MSI_RecordGetString(row,1); file = get_loaded_file( package, filename ); @@ -4359,23 +4374,9 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) return ERROR_SUCCESS; } - len = strlenW(ExeStr) + strlenW( file->TargetPath ) + 2; - - FullName = msi_alloc(len*sizeof(WCHAR)); - strcpyW(FullName,ExeStr); - strcatW( FullName, file->TargetPath ); - strcatW(FullName,close); - - TRACE("Registering %s\n",debugstr_w(FullName)); - brc = CreateProcessW(NULL, FullName, NULL, NULL, FALSE, 0, NULL, c_colon, - &si, &info); + TRACE("Registering %s\n", debugstr_w( file->TargetPath )); - if (brc) - { - CloseHandle(info.hThread); - msi_dialog_check_messages(info.hProcess); - CloseHandle(info.hProcess); - } + register_dll( file->TargetPath, FALSE ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, filename ); @@ -4383,7 +4384,6 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) ui_actiondata( package, szSelfRegModules, uirow ); msiobj_release( &uirow->hdr ); - msi_free( FullName ); return ERROR_SUCCESS; } @@ -4410,21 +4410,11 @@ static UINT ACTION_SelfRegModules(MSIPACKAGE *package) static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) { - static const WCHAR regsvr32[] = - {'r','e','g','s','v','r','3','2','.','e','x','e',' ','/','u',' ','\"',0}; - static const WCHAR close[] = {'\"',0}; MSIPACKAGE *package = param; LPCWSTR filename; - LPWSTR cmdline; MSIFILE *file; - DWORD len; - STARTUPINFOW si; - PROCESS_INFORMATION pi; - BOOL ret; MSIRECORD *uirow; - memset( &si, 0, sizeof(STARTUPINFOW) ); - filename = MSI_RecordGetString( row, 1 ); file = get_loaded_file( package, filename ); @@ -4434,22 +4424,9 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) return ERROR_SUCCESS; } - len = strlenW( regsvr32 ) + strlenW( file->TargetPath ) + 2; - - cmdline = msi_alloc( len * sizeof(WCHAR) ); - strcpyW( cmdline, regsvr32 ); - strcatW( cmdline, file->TargetPath ); - strcatW( cmdline, close ); - - TRACE("Unregistering %s\n", debugstr_w(cmdline)); + TRACE("Unregistering %s\n", debugstr_w( file->TargetPath )); - ret = CreateProcessW( NULL, cmdline, NULL, NULL, FALSE, 0, NULL, c_colon, &si, &pi ); - if (ret) - { - CloseHandle( pi.hThread ); - msi_dialog_check_messages( pi.hProcess ); - CloseHandle( pi.hProcess ); - } + register_dll( file->TargetPath, TRUE ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, filename ); @@ -4457,7 +4434,6 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) ui_actiondata( package, szSelfUnregModules, uirow ); msiobj_release( &uirow->hdr ); - msi_free( cmdline ); return ERROR_SUCCESS; }