[Windows Installer] Error code omzetten in foutmelding

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Nu online

Tomatoman

Fulltime prutser

Topicstarter
De Windows Installer functies in MsiExec.exe en InstMsi.exe kunnen foutcodes retourneren die meestal liggen tussen 1600 en 1700. Nu krijg ik wel deze foutcodes, maar hoe kan ik die omzetten naar een leesbare foutmelding? Zo wil ik bij foutcode 1605 de omschrijving 'This action is only valid for products that are currently installed' hebben, anders weet een gebruiker van mijn programma nooit wat er is foutgegaan.

Hoe kan ik zo'n foutcode vertalen naar de bijbehorende tekst? FormatMessage() geeft een lege string terug, daar heb ik niets aan. Voor de duidelijkheid: de error codes zijn iets anders dan de records met error messages in de Error tabel van een MSI package. Het vreemde is dat ik in de hele MSI SDK geen enkele informatie kan vinden over het omzetten van een foutcode in tekst.

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Nu online

Tomatoman

Fulltime prutser

Topicstarter
Als test heb ik nog een externe user interface handler ingebouwd die alle berichten monitort:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function NewHandler(pvContext: Pointer; iMessageType: Longword;
  szMessage: PChar): Longint; stdcall;
var
  InstMsg: Longword;
begin
  InstMsg := iMessageType and $0F000000;
  case InstMsg of
    INSTALLMESSAGE_FATALEXIT,
    INSTALLMESSAGE_ERROR,
    INSTALLMESSAGE_WARNING,
    INSTALLMESSAGE_TERMINATE:
      if szMessage = nil then
        ShowMessage('Install code: %p. No message', [Ptr(InstMsg)])
      else
        ShowMessage('Install code: %p. %s', [Ptr(InstMsg), szMessage]);
  end;
  Result := 0;
end;

procedure ConfigureMSI;
const
  Prod = '{8BD8CA45-300D-4C56-8CA6-056C6150295B}';
  Feat = 'ExplorerPlugin';
var
  OldHandler: INSTALLUI_HANDLER;
begin
  OldHandler := MsiSetExternalUI(NewHandler, $FFFFFFFF, nil);
  MsiConfigureFeature(Prod, Feat, INSTALLSTATE_LOCAL);
  MsiSetExternalUI(OldHandler , 0, nil); // oude situatie herstellen
end;
Aan de hand van de gefilterde berichten kan ik zien dat er als je de installatie voortijdig afbreekt wel een INSTALLMESSAGE_TERMINATE voorbijkomt, maar dat daar geen szMessage aan hangt. Iedere functie die de installatie start (in mijn geval MsiConfigureFeature), krijgt wel een foutcode 1602 terug - dat is ERROR_INSTALL_USEREXIT - maar zelfs via de UI handler kan ik dus geen tekstje afvangen. Frustrerend. :|

Een goede grap mag vrienden kosten.