Hi this is my full working 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;
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); } /******************************************************************** ExtractBinary - helper function ********************************************************************/ HRESULT ExtractBinary( __in LPCWSTR wzBinaryId, __out BYTE** pbData, __out DWORD* pcbData ) { HRESULT hr = S_OK; LPWSTR pwzSql = NULL; PMSIHANDLE hView; PMSIHANDLE hRec; // make sure we're not horked from the get-go hr = WcaTableExists(L"Binary"); if (S_OK != hr) { if (SUCCEEDED(hr)) { hr = E_UNEXPECTED; } ExitOnFailure(hr, "There is no Binary table."); } ExitOnNull(wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be null"); ExitOnNull(*wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be empty string"); hr = StrAllocFormatted(&pwzSql, L"SELECT `Data` FROM `Binary` WHERE `Name`=\'%s\'", wzBinaryId); ExitOnFailure(hr, "Failed to allocate Binary table query."); hr = WcaOpenExecuteView(pwzSql, &hView); ExitOnFailure(hr, "Failed to open view on Binary table"); hr = WcaFetchSingleRecord(hView, &hRec); ExitOnFailure(hr, "Failed to retrieve request from Binary table"); hr = WcaGetRecordStream(hRec, 1, pbData, pcbData); ExitOnFailure(hr, "Failed to read Binary.Data."); LExit: ReleaseStr(pwzSql); return hr; } Hope this helps you..:) Natalie -----Original Message----- From: Christopher Painter [mailto:chr...@iswix.com] Sent: 30 April 2013 15:32 To: General discussion for Windows Installer XML toolset.; wix-users@lists.sourceforge.net Subject: Re: [WiX-users] Extract Binary file from MSI C++ C#/DTF custom actions have a really nice story to support this without writing a lick of code. You just add the files to the MSBuild project as Type: Content Action: Copy Always and they will show up in the current directory at execution time. I wonder how much work it would be to get the C++ CA projects to support this also. ---------------------------------------- From: "TimM" <timmay...@smarttech.com> Sent: Tuesday, April 30, 2013 8:58 AM To: wix-users@lists.sourceforge.net Subject: Re: [WiX-users] Extract Binary file from MSI C++ Natalie, I have basically the same task where we have about 5 files within the binary table that need to be extracted so that we can trigger a custom actions that depends on all 5 files existing in the same folder. So I would like to know if you have this working correctly and if so would you be able to supply your solution? Thanks. -- View this message in context: http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Extract-Binary -file-from-MSI-C-tp7582039p7585498.html Sent from the wix-users mailing list archive at Nabble.com. ---------------------------------------------------------------------------- -- Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET Get 100% visibility into your production application - at no cost. Code-level diagnostics for performance bottlenecks with <2% overhead Download for free and get started troubleshooting in minutes. http://p.sf.net/sfu/appdyn_d2d_ap1 _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ---------------------------------------------------------------------------- -- Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET Get 100% visibility into your production application - at no cost. Code-level diagnostics for performance bottlenecks with <2% overhead Download for free and get started troubleshooting in minutes. http://p.sf.net/sfu/appdyn_d2d_ap1 _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ------------------------------------------------------------------------------ Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET Get 100% visibility into your production application - at no cost. Code-level diagnostics for performance bottlenecks with <2% overhead Download for free and get started troubleshooting in minutes. http://p.sf.net/sfu/appdyn_d2d_ap1 _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users