2010-04-28 24 views
5

Tengo un archivo DLL de un instalador anterior de WiSE que estoy tratando de trabajar en WiX, así que estoy bastante seguro de que la DLL funciona con instaladores basados ​​en MSI.WiX - Pasar parámetros a una CustomAction (DLL)

Aquí es mi definición:

<Binary Id="SetupDLL" SourceFile="../Tools/Setup.dll" /> 
<CustomAction Id="ReadConfigFiles" BinaryKey="SetupDLL" DllEntry="readConfigFiles" /> 

y uso:

función
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="ReadConfigFiles" Order="3">1</Publish> 

Mi C++ es el siguiente:

extern "C" UINT __stdcall ReadConfigFiles(MSIHANDLE hInstall, CHAR * szDirectory) 

exactamente dónde puedo pasar en los parámetros?

Respuesta

5

No puede pasar parámetros directamente porque para que esto funcione, su función debe exportarse exactamente con la huella adecuada. Cuando se llama a readConfigFiles en el archivo DLL de acción personalizada, debe tener una huella de la siguiente manera:

extern "C" UINT __stdcall readConfigFiles(MSIHANDLE hInstaller); 

Usted puede utilizar el parámetro hInstaller leer las propiedades de la MSI. Utilice MsiGetProperty():

HRESULT GetProperty(MSIHANDLE hInstaller, LPCWSTR property, LPWSTR value, DWORD cch_value) { 
    UINT err = MsiGetProperty(hInstaller, property, value, &cch_value); 
    return (err == ERROR_SUCCESS ? S_OK : E_FAIL); 
} 

A continuación, sólo asegúrese de que establece la propiedad en su archivo .wxs:

<Property Id="YOUR-PROPERTY-NAME">your-property-value</Property> 
+2

y cch_value es longitud del búfer (en caso de que alguien se pregunta, tuve que cavar un poco para encontrar esto fuera;) Hay algunos ejemplos más en profundidad, pero un "truco" que encontré si no se conoce la longitud es llamar a MsiGetProperty con bufferLen = 0, que falla porque no hay suficiente espacio para almacenar un valor pero también llena el bufferLen de cuánto espacio se necesita para almacenar el valor real. Llamar a MsiGetProperty nuevamente (asegurándose de asignar valor = TCHAR [bufferLen + 1] con +1 para dejar espacio para un terminador nulo) devolverá el valor real. – glenneroo

+1

Sí, cch es la notación húngara de Microsoft para "Count of CHaracters", en contraposición a cb que es "Count of Bytes". –

+0

Y sí, eso es un [comportamiento documentado] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx). Win32 y el shell fueron bastante consistentes en seguir este patrón. –

Cuestiones relacionadas