I use this function to call an executable from my msi. However, the window for the executable is hidden behind my MSI window. Is there any way to bring it to the front. Sorry for the nobe question, but I tried to minimize all windows before invoking ShellExecute , but that still doesn't bring the executable window to the forefront. Thanks
extern "C" UINT __stdcall InstallDrivers(MSIHANDLE hInstall) { HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; HANDLE hFile = INVALID_HANDLE_VALUE; BYTE* pbData = NULL; DWORD cbData = 0; char pwzFilename[MAX_PATH], szDriverType[MAX_PATH], pwzSentinelFilename[MAX_PATH], szIsInstalled[MAX_PATH]; LPWSTR szValueBuf = NULL, szIsHaspInstalled = NULL, szIsSentinelInstalled = NULL; hr = WcaInitialize(hInstall, "InstallDrivers"); ExitOnFailure(hr, "Failed to initialize"); WcaLog(LOGMSG_STANDARD, "Initialized."); WcaLog(LOGMSG_STANDARD, "%s", szValueBuf); CreateDirectory("C:\\Temp", NULL); strcpy_s(pwzFilename, "C:\\Temp\\HASPUserSetup.exe"); hr = ExtractBinary(L"Hasp", &pbData, &cbData); ExitOnFailure(hr, "failed to extract binary data"); if ((hFile = CreateFile(pwzFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } DWORD cbWritten = 0; if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) ) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not write to file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } CloseHandle(hFile); strcpy_s(pwzSentinelFilename, "C:\\Temp\\sentinel_setup.exe"); hr = ExtractBinary(L"Sentinel", &pbData, &cbData); ExitOnFailure(hr, "failed to extract binary data"); if ((hFile = CreateFile(pwzSentinelFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) ) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not write to file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } CloseHandle(hFile); hr = WcaGetProperty(L"DRIVER", &szValueBuf); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szDriverType, szValueBuf, 260); if (strcmp(szDriverType, "Hasp") == 0) { hr = WcaGetProperty(L"SENTINELINSTALLED", &szIsSentinelInstalled); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szIsInstalled, szValueBuf, 260); if (strcmp(szIsInstalled, "Sentinel Protection Installer 7.6.5") == 0) { ShellExecute(NULL, "open", pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL); } ShellExecute(NULL, "open", pwzFilename, NULL, NULL, SW_SHOWNORMAL); }else { hr = WcaGetProperty(L"HASPINSTALLED", &szIsHaspInstalled); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szIsInstalled, szIsHaspInstalled, 260); if (strcmp(szIsInstalled, "Sentinel Runtime") == 0) { ShellExecute(NULL, "open", pwzFilename, NULL, NULL, SW_SHOWNORMAL); } ShellExecute(NULL, "open", pwzSentinelFilename, NULL, NULL, SW_SHOWNORMAL); } LExit: er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; return WcaFinalize(er); }
Updated code:
extern "C" UINT __stdcall InstallDrivers(MSIHANDLE hInstall) { HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; HANDLE hFile = INVALID_HANDLE_VALUE; BYTE* pbData = NULL; DWORD cbData = 0; char pwzFilename[MAX_PATH], szDriverType[MAX_PATH], pwzSentinelFilename[MAX_PATH], szIsInstalled[MAX_PATH]; LPWSTR szValueBuf = NULL, szIsHaspInstalled = NULL, szIsSentinelInstalled = NULL; SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = NULL; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpParameters = NULL; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOWNORMAL; ShExecInfo.hInstApp = NULL; hr = WcaInitialize(hInstall, "InstallDrivers"); ExitOnFailure(hr, "Failed to initialize"); WcaLog(LOGMSG_STANDARD, "Initialized."); WcaLog(LOGMSG_STANDARD, "%s", szValueBuf); CreateDirectory("C:\\Temp", NULL); strcpy_s(pwzFilename, "C:\\Temp\\HASPUserSetup.exe"); hr = ExtractBinary(L"Hasp", &pbData, &cbData); ExitOnFailure(hr, "failed to extract binary data"); if ((hFile = CreateFile(pwzFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } DWORD cbWritten = 0; if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) ) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not write to file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } CloseHandle(hFile); strcpy_s(pwzSentinelFilename, "C:\\Temp\\sentinel_setup.exe"); hr = ExtractBinary(L"Sentinel", &pbData, &cbData); ExitOnFailure(hr, "failed to extract binary data"); if ((hFile = CreateFile(pwzSentinelFilename, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not create new temporary file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } if ( !WriteFile(hFile, pbData, cbData, &cbWritten, NULL) ) { PMSIHANDLE hRecord = MsiCreateRecord(0); MsiRecordSetString(hRecord, 0, TEXT("Could not write to file")); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord); return ERROR_INSTALL_USEREXIT; } CloseHandle(hFile); hr = WcaGetProperty(L"DRIVER", &szValueBuf); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szDriverType, szValueBuf, 260); if (strcmp(szDriverType, "Hasp") == 0) { hr = WcaGetProperty(L"SENTINELINSTALLED", &szIsSentinelInstalled); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szIsInstalled, szValueBuf, 260); if (strcmp(szIsInstalled, "Sentinel Protection Installer 7.6.5") == 0) { AllowSetForegroundWindow(ASFW_ANY); ShExecInfo.lpFile = pwzSentinelFilename; ShellExecuteEx(&ShExecInfo); } AllowSetForegroundWindow(ASFW_ANY); ShExecInfo.lpFile = pwzFilename; ShellExecuteEx(&ShExecInfo); }else { hr = WcaGetProperty(L"HASPINSTALLED", &szIsHaspInstalled); ExitOnFailure(hr, "failed to get driver info"); wcstombs(szIsInstalled, szIsHaspInstalled, 260); if (strcmp(szIsInstalled, "Sentinel Runtime") == 0) { AllowSetForegroundWindow(ASFW_ANY); ShExecInfo.lpFile = pwzFilename; ShellExecuteEx(&ShExecInfo); } AllowSetForegroundWindow(ASFW_ANY); ShExecInfo.lpFile = pwzSentinelFilename; ShellExecuteEx(&ShExecInfo); } LExit: er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; return WcaFinalize(er); }