2010-01-25 13 views
5

tengo una acción personalizada WIX básica:WIX C++ acción personalizada

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

Añadido al instalador:

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

El problema es que, no importa lo que hago, la hInstaller mango no es válido. Establecí la acción para confirmar, pospuse, cambié el lugar en la secuencia InstallExecute, hInstaller no siempre es válido.

Cualquier ayuda sería apreciada. Gracias.

+0

¿De qué manera no es válido? ¿Recibes un error de una llamada API? –

+0

Si realizo una llamada que utiliza el identificador, la función devolverá el mensaje de error Invalid_Handle. –

+0

ignorando el asa, ¿se está llamando correctamente a la función? – saschabeaumont

Respuesta

7

necesita exportar la función llamada de modo MSI puede llamar usando sin decorar C nombre del estilo

Reemplazar el código con esta

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

Como se mencionó here, la única manera de superar la mutilación de una __stdcall es utilizar:

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

Esto crea una segunda entr y en la tabla de exportación de DLL.

+2

Otra forma de asegurar el nombre de la función no triturada se incluye en las exportaciones de DLL, es EXPORTARla en un archivo DEF y agregarla a las Propiedades del vinculador (Enlazador -> Entrada -> Archivo de definición del módulo). – Pierre

Cuestiones relacionadas