Sample ICE in C++

Windows Installer

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: 8/13/2009

© 2009 Microsoft Corporation. All rights reserved.