2010-01-25 9 views
5

ich eine grundlegende WIX benutzerdefinierte Aktion habe:WIX C++ Custom Action

 UINT __stdcall MyCustomAction(MSIHANDLE hInstaller) 
     { 
      DWORD dwSize=0; 
      MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize); 
      return ERROR_SUCCESS; 
     } 

den Installateur Hinzugefügt:

<CustomAction Id="CustomActionId" FileKey="CustomDll" DllEntry="MyCustomAction"/> 
    <InstallExecuteSequence> 
     <Custom Action="CustomActionId" Before="InstallFinalize" /> 
    </InstallExecuteSequence> 

Das Problem ist, dass, egal was ich tue, der Griff hInstaller ist nicht gültig. Ich habe die Aktion zum Festschreiben festgelegt, verschoben, die Stelle in der InstallExecute-Sequenz geändert, hInstaller ist immer nicht gültig.

Jede Hilfe wäre willkommen. Vielen Dank.

+0

In welcher Weise ist es nicht gültig? Erhalten Sie einen Fehler von einem API-Aufruf zurück? –

+0

Wenn ich einen Aufruf, der das Handle verwendet, mache, wird die Funktion Invalid_Handle Fehlermeldung zurückgeben. –

+0

Ignorieren der Handle, ist die Funktion selbst korrekt aufgerufen? – saschabeaumont

Antwort

7

Sie müssen die aufgerufenen Funktion exportieren, so MSI es undecorated C Artnamen mit anrufen

Ersetzen Sie den Code mit diesem

extern "C" _declspec(dllexport) UINT __stdcall MyCustomAction(MSIHANDLE hInstall); 

    extern "C" UINT __stdcall MyCustomAction(MSIHANDLE hInstall) 
    { 
     DWORD dwSize=0; 
     MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize); 
     return ERROR_SUCCESS; 
    } 
3

Wie here erwähnt, ist die einzige Möglichkeit, die Mangeln eines zu überwinden __stdcall zu bedienen:

#pragma comment(linker, "/EXPORT:[email protected]@@23mangledstuff#@@@@")

Dies schafft eine zweite entr y in der DLL-Exporttabelle.

+2

Eine andere Möglichkeit, den Namen der nicht-entstellten Funktion sicherzustellen, ist in den DLL-Exporten enthalten. Sie wird in eine DEF-Datei exportiert und den Linker-Eigenschaften hinzugefügt (Linker -> Eingabe -> Moduldefinitionsdatei). – Pierre