Sample ICE in C++
This sample code is from an ICE custom action ( ICE01). It validates that the ICE mechanism is working by displaying the time. The ICE posts a message giving the time the installer called the ICE. This ICE should never return an error.
// // test of external database access #include <windows.h> #include <stdio.h> #include <tchar.h> #include <strsafe.h> #include <MsiQuery.h> #pragma comment(lib, "msi.lib") /////////////////////////////////////////////////////////// // ICE01 - simple ICE that does not test anything UINT __stdcall ICE01(MSIHANDLE hInstall) { // setup the record to describe owner and date created PMSIHANDLE hRecCreated = ::MsiCreateRecord(1); ::MsiRecordSetString(hRecCreated, 0, TEXT("ICE01\t3\tCreated 04/29/1998 by <insert author's name here>")); // post the owner message ::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated); // setup the record to describe the last time the ICE was modified ::MsiRecordSetString(hRecCreated, 0, TEXT("ICE01\t3\tLast modified 05/06/1998 by <insert author's name here>")); // post the last modification message ::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated); // setup the record to describe what the ICE evaluates ::MsiRecordSetString(hRecCreated, 0, TEXT("ICE01\t3\tSimple ICE illustrating the ICE concept")); // post the description of evaluation message ::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated); // time value to be sent on TCHAR szValue[200]; DWORD cchValue = sizeof(szValue)/sizeof(TCHAR); // try to get the time of this call if (MsiGetProperty(hInstall, TEXT("Time"), szValue, &cchValue) != ERROR_SUCCESS) StringCchCopy(szValue, sizeof("(none)")/sizeof(TCHAR)+1, TEXT("none"));// no time available // setup the record to be sent as a message PMSIHANDLE hRecTime = ::MsiCreateRecord(2); ::MsiRecordSetString(hRecTime, 0, TEXT("ICE01\t3\tCalled at [1].")); ::MsiRecordSetString(hRecTime, 1, szValue); // send the time ::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecTime); return ERROR_SUCCESS; // allows other ICEs will continue }
Send comments about this topic to Microsoft
Build date: 2/3/2012