2010-04-28 17 views
5

Ho una DLL da un vecchio programma di installazione guisa che sto cercando di far funzionare in WiX, quindi sono abbastanza sicuro che la DLL funziona con gli installatori MSI-based.WiX - Passaggio di parametri a una CustomAction (DLL)

Ecco la mia definizione:

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

e il loro utilizzo:

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

mio C++ si presenta così:

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

Dove esattamente posso passare parametri?

risposta

5

Non è possibile passare parametri direttamente perché in ordine per far funzionare tutto questo, la funzione deve essere esportato con esattamente l'impronta giusta. Quando si chiama readConfigFiles nella vostra azione dll personalizzato, dovrebbe avere un ingombro simile a questo:

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

È possibile utilizzare il parametro hInstaller per leggere oggetti di MSI. Utilizzare 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); 
} 

Poi basta assicurarsi di impostare la proprietà nel file .wxs:

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

& cch_value è la lunghezza del buffer (nel caso in cui qualcun altro si sta chiedendo, ho dovuto scavare un po 'per trovare questo fuori;) ci sono un paio di esempi in profondità là fuori, ma un "trucco" che ho trovato, se non si conosce la lunghezza è di chiamare MsiGetProperty con bufferLen = 0, che non riesce perché non c'è spazio sufficiente per memorizzare un valore ma riempie anche bufferLen con quanto spazio è necessario per memorizzare il valore effettivo. Chiamando nuovamente MsiGetProperty (assicurandosi di allocare value = TCHAR [bufferLen + 1] con +1 per creare spazio per un terminatore null) si restituirà il valore effettivo. – glenneroo

+1

Sì, cch è la notazione ungherese di Microsoft per "Numero di caratteri", in contrapposizione a cb che è "Numero di byte". –

+0

E sì, questo è un [comportamento documentato] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) aspx). Win32 e la shell erano abbastanza coerenti nel seguire questo schema. –

Problemi correlati