自定义操作中的错误处理

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;
}

请参见

其他资源

部署中的自定义操作管理