,如果你說你用的是什麼語言,這就幫...
如果您使用託管代碼...警惕限制(以下從維克斯文件的引用)
之前選擇寫在託管代碼,而不是傳統的本地C++代碼自定義操作,您應該謹慎考慮以下幾點:
顯然,它引入了基於.NET Framework的依賴性。你的MSI包可能應該有一個LaunchCondition來在任何事情發生之前檢查是否存在正確版本的.NET Framework。
如果自定義操作,在卸載時運行,那麼即使你的產品的卸載,如果可以在.NET Framework不存在失敗。這意味着如果用戶在產品之前卸載.NET Framework,用戶可能會遇到問題。
託管自定義操作應當被配置爲針對.NET Framework的一個特定版本運行,該版本應該與你的實際產品違背了版本。允許版本「浮動」到最新安裝的.NET Framework可能會導致未來版本的兼容性問題。 .NET Framework提供了很好的理由 - 並行功能 - 使用它。
此外,您也應該瞭解爲什麼VBScript (and JScript) MSI CustomActions suck
無論如何,無視一切......這裏是我發現的地方在很久以前,我使用的日誌記錄一些示例C++代碼。您可能能夠找出應該用您選擇的語言調用的正確功能。
#define _USE_RTM_VERSION
void LogString(MSIHANDLE hInstall, TCHAR* szString)
{
PMSIHANDLE newHandle = ::MsiCreateRecord(2);
TCHAR szTemp[MAX_PATH * 2];
sprintf_s(szTemp, MAX_PATH * 2, "-- MSI_LOGGING -- %s", szString);
MsiRecordSetString(newHandle, 0, szTemp);
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle);
}
UINT __stdcall MyCustomAction (MSIHANDLE hModule)
{
LogString(hModule, "Whoa! I am a custom action..");
return ERROR_SUCCESS;
}
我一直在使用JavaScript自定義操作了良好的效果。比C++更容易編寫。沒有像C#那樣的額外的.NET依賴。 try ... catch使它相當健壯。 – Cheeso 2009-11-23 23:16:33