[8/9] msi: Register dlls directly in the SelfRegModules and SelfUnregModules actions.
Hans Leidekker
hans at codeweavers.com
Fri Jul 23 02:43:27 CDT 2010
---
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;
}
--
1.7.0.4
More information about the wine-patches
mailing list