Module: wine Branch: master Commit: b036ee63096679bcfc7c284076735891eaf02661 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b036ee63096679bcfc7c284076...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Nov 7 15:56:37 2012 +0100
msi: Register dlls in a separate process.
---
dlls/msi/action.c | 36 ++++++++++++++++++------------------ 1 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index a180399..f9ab550 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -4720,27 +4720,27 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package )
static void register_dll( const WCHAR *dll, BOOL unregister ) { - HMODULE hmod; + static const WCHAR regW[] = + {'r','e','g','s','v','r','3','2','.','e','x','e',' ','"','%','s','"',0}; + static const WCHAR unregW[] = + {'r','e','g','s','v','r','3','2','.','e','x','e',' ','/','u',' ','"','%','s','"',0}; + PROCESS_INFORMATION pi; + STARTUPINFOW si; + WCHAR *cmd;
- hmod = LoadLibraryExW( dll, 0, LOAD_WITH_ALTERED_SEARCH_PATH ); - if (hmod) - { - HRESULT (WINAPI *func_ptr)( void ); - const char *func = unregister ? "DllUnregisterServer" : "DllRegisterServer"; + if (!(cmd = msi_alloc( strlenW(dll) * sizeof(WCHAR) + sizeof(unregW) ))) return;
- 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; + if (unregister) sprintfW( cmd, unregW, dll ); + else sprintfW( cmd, regW, dll ); + + memset( &si, 0, sizeof(STARTUPINFOW) ); + if (CreateProcessW( NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )) + { + CloseHandle( pi.hThread ); + msi_dialog_check_messages( pi.hProcess ); + CloseHandle( pi.hProcess ); } - WARN("failed to load library %u\n", GetLastError()); + msi_free( cmd ); }
static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)