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

Reply via email to