WIX C ++ acción personalizada
-
22-09-2019 - |
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.
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