2010-01-25 6 views
5

J'ai une action personnalisée WIX de base:WIX C++ action personnalisée

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

Ajouté à l'installateur:

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

Le problème est que, peu importe ce que je fais, la hInstaller poignée est pas valide. J'ai mis l'action à commettre, différée, changé l'endroit dans la séquence InstallExecute, hInstaller est toujours non valide.

Toute aide serait appréciée. Merci.

+0

En quoi n'est-ce pas valable? Recevez-vous une erreur lors d'un appel d'API? –

+0

Si je fais un appel qui utilise le handle, la fonction retournera le message d'erreur Invalid_Handle. –

+0

en ignorant le handle, la fonction elle-même est appelée correctement? – saschabeaumont

Répondre

7

Vous devez exporter la fonction appelée si MSI peut l'appeler en utilisant le nom de style undecorated C

Remplacez votre code avec cette

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

Comme mentionné here, la seule façon de surmonter la mutiler d'un __stdcall est d'utiliser:

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

Cela crée une seconde ENTR y dans la table d'exportation DLL.

+2

Une autre façon d'assurer le nom de la fonction non mutilée est incluse dans les exportations de DLL, est de l'EXPORTER dans un fichier DEF et de l'ajouter aux propriétés du Linker (Linker -> Input -> Module Definition File). – Pierre

Questions connexes