Condividi tramite


Gestione degli errori nelle azioni personalizzate

La gestione degli errori che si verificano nella distribuzione viene per lo più eseguita automaticamente da Windows Installer. Gli errori nelle azioni personalizzate possono tuttavia essere la causa del mancato funzionamento di un programma di installazione. In tutte le azioni personalizzate è contenuto codice e, come avviene per tutto il codice, la gestione degli errori costituisce una parte essenziale del processo. Se ad esempio un'azione personalizzata contiene codice che consente di aprire un file e tale file non è disponibile, è necessario che l'errore venga segnalato da un gestore degli errori a Windows Installer, affinché si possa procedere al rollback dell'installazione.

Nota

Per le azioni personalizzate scritte in JScript o VBScript, l'errore non viene restituito a Windows Installer e ciò impedisce di eseguire il rollback dell'installazione. È tuttavia possibile segnalare l'errore all'utente mediante una finestra di dialogo. Se un'azione personalizzata è di importanza cruciale per l'installazione, è preferibile scriverla in Visual Basic, Visual C# o Visual C++, in modo che l'errore venga passato a Windows Installer.

Intercettare l'errore

Per gestire un errore in un'azione personalizzata, è necessario aggiungere il codice per intercettare l'errore e passare l'informazione a Windows Installer. Negli esempi riportati di seguito viene illustrato come gestire un errore nel codice di Visual Basic, Visual C#, Visual C++, JScript e 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;
}

Vedere anche

Altre risorse

Gestione delle azioni personalizzate durante la distribuzione