Обработка ошибок в настраиваемых действиях
Установщик Windows автоматически управляет обработкой ошибок при развертывании, однако ошибки в настраиваемых действиях могут привести к сбою в установщике. Все настраиваемые действия содержат код и, как и с любым другим кодом, обработка ошибок является неотъемлемой частью процесса. Например, если в настраиваемом действии содержится код, который открывает файл, а файл отсутствует, обработчик ошибок должен отправить отчет об ошибке обратно в установщик Windows, чтобы откатить процесс установки.
Примечание
Если настраиваемые действия написаны на JScript или VBScript, ошибка не будет возвращена в установщик Windows и не будет выполнен откат установки; пользователь увидит диалоговое окно с ошибкой.Настраиваемые действия, которые абсолютно необходимы для процесса установки, должны быть написаны с использованием языка Visual Basic, Visual C# или Visual C++, чтобы иметь возможность передать ошибку в установщик Windows.
Перехват ошибки
Чтобы обработать ошибку в настраиваемом действии, необходимо добавить код для перехвата ошибки и передачи сведений обратно в установщик Windows. В следующих примерах показано, как обрабатывать ошибку в коде 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;
}