Pregunta

Tengo una acción personalizada WIX básica:

        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, el mango hInstaller no es válido. He puesto la acción de cometer, diferido, cambiado el lugar en la secuencia InstallExecute, hInstaller es siempre no es válido.

Cualquier ayuda sería apreciada. Gracias.

¿Fue útil?

Solución

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

Reemplazar el código con este

    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;
    }

Otros consejos

Como se ha mencionado aquí , la única manera de superar la mutilación de una __stdcall es usar:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top