2010-04-28 33 views
5

Mam DLL ze starego instalatora WiSE, że próbuję uzyskać pracę w WiX, więc jestem prawie pewien, że DLL działa z instalatorami opartymi na MSI.WiX - przekazywanie parametrów do CustomAction (DLL)

Oto moja definicja:

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

i użytkowanie:

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

Moja funkcja C++ wygląda następująco:

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

Gdzie dokładnie mogę przekazać w parametrach?

Odpowiedz

5

Nie można przekazać parametrów bezpośrednio, ponieważ aby to zadziałało, należy wyeksportować funkcję z dokładnie właściwym śladem. Podczas rozmowy telefonicznej readConfigFiles w dll akcję niestandardową, powinien mieć ślad takiego:

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

Można użyć parametru hInstaller czytać właściwości z MSI. Użyj 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); 
} 

Po prostu upewnij się, że ustawienia właściwości w pliku .wxs:

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

& cch_value jest długość buforu (w przypadku kogoś innego zastanawia się, musiałem kopać trochę znaleźć to na zewnątrz;) Istnieje kilka bardziej dogłębnych przykładów tam, ale "sztuczka" znalazłem, jeśli nie wiesz, długość to wywołanie MsiGetProperty z bufferLen = 0, co kończy się niepowodzeniem, ponieważ nie ma wystarczająco dużo miejsca do przechowywania wartość, ale także wypełnia bufferLen ilością miejsca potrzebnego do zapisania rzeczywistej wartości. Ponowne wywołanie MsiGetProperty (upewniając się, że przydzielisz wartość = TCHAR [bufferLen + 1] za pomocą +1, aby zrobić miejsce na zerowanie) zwróci wartość rzeczywistą. – glenneroo

+1

Tak, cch to węgierska notacja Microsoftu dla "Count of CHaracters", w przeciwieństwie do cb, która jest "Count of Bytes". –

+0

I tak, to jest [udokumentowane zachowanie] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx). Win32 i powłoka były dość spójne podążając za tym wzorcem. –

Powiązane problemy