Share via


自訂動作中的錯誤處理

更新:2007 年 11 月

Windows Installer 自動管理部署中大部分的錯誤處理,但是自訂動作中的錯誤可能導致安裝程式失敗。自訂動作都有程式碼,程式碼的錯誤處理是處理序的基本部分。例如,自訂動作中的程式碼找不到要開啟的檔案時,錯誤處理常式會向 Windows Installer 回報這項錯誤,以便讓安裝復原。

注意事項:

以 JScript 或 VBScript 撰寫的自訂動作不會向 Windows Installer 回報這項錯誤,因而無法讓安裝復原,但會向使用者顯示錯誤對話方塊。安裝的重要自訂動作應該以 Visual Basic、Visual C# 或 Visual C++ 撰寫,以便向 Windows Installer 回報錯誤。

設陷捕捉錯誤

為處理自訂動作中的錯誤,您應該加入程式碼來截取錯誤,並向 Windows Installer 傳遞這項資訊。下列範例會顯示如何處理 Visual Basic、Visual C#、Visual C++、JScript 和 VBScript 程式碼中的錯誤:

' Uses System.IO and System.Configuration.Install
Dim Info As New FileInfo("MyFile.txt")
If Not Info.Exists Then
    Throw New InstallException("File does not exist")
End If
// Uses System.IO and System.Configuration.Install
FileInfo Info = new FileInfo("MyFile.txt");
if (Info.Exists == false)
   throw new InstallException("File does not exist");
'VBScript
msiMessageTypeError = &H01000000 
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("c:\MyFile.txt") Then
   Set record = Session.Installer.CreateRecord(0)
   record.StringData(0) = "File not found."
   Session.Message msiMessageTypeError, record
End If
var msiMessageTypeError = 0x01000000;
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (!fso.FileExists("c:\\MyFile.txt"))
{
   var record = Session.Installer.CreateRecord(0);
   record.StringData(0) = "File not found.";
   Session.Message(msiMessageTypeError, record);
}
#pragma comment(lib, "msi.lib")

#include <windows.h>
#include <msiquery.h>

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwREason, LPVOID lpReserved)
{
   return TRUE;
}

extern "C" __declspec(dllexport) __stdcall Install(MSIHANDLE hInstall)
{
   if (GetFileAttributes(TEXT("c:\\MyFile.txt")) == -1)
   {
      PMSIHANDLE hRecord = MsiCreateRecord(0);
      MsiRecordSetString(hRecord, 0, TEXT("File does not exist."));
      MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
      return ERROR_INSTALL_USEREXIT;
   }
   
   return ERROR_SUCCESS;
}

請參閱

其他資源

部署中的自訂動作管理