WIX C ++ azione personalizzata
-
22-09-2019 - |
Domanda
Ho un semplice azione WIX personalizzato:
UINT __stdcall MyCustomAction(MSIHANDLE hInstaller)
{
DWORD dwSize=0;
MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize);
return ERROR_SUCCESS;
}
aggiunta al programma di installazione:
<CustomAction Id="CustomActionId" FileKey="CustomDll" DllEntry="MyCustomAction"/>
<InstallExecuteSequence>
<Custom Action="CustomActionId" Before="InstallFinalize" />
</InstallExecuteSequence>
Il problema è che, non importa quello che faccio, il hInstaller maniglia non è valido. Ho impostato l'azione di commettere, in differita, cambiato il luogo in sequenza InstallExecute, hInstaller non è sempre valido.
Qualsiasi aiuto sarebbe apprezzato. Grazie.
Soluzione
È necessario esportare la funzione chiamata in modo da MSI può chiamare utilizzando undecorated C nome dello stile
Sostituire il codice con questo
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;
}
Altri suggerimenti
qui , l'unico modo per superare la storpiatura di un __stdcall
è quello di utilizzare:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Questo crea una seconda voce nella tabella DLL di esportazione.