2010-04-28 3 views
5

У меня есть DLL от старого установщика WiSE, который я пытаюсь работать в WiX, поэтому я уверен, что DLL работает с установщиками на базе MSI.WiX - Передача параметров в CustomAction (DLL)

Вот мое определение:

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

и использование:

функция
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="ReadConfigFiles" Order="3">1</Publish> 

Мой C++ выглядит следующим образом:

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

Где именно я могу передать параметры?

ответ

5

Вы не можете передавать параметры напрямую, потому что для того, чтобы это сработало, ваша функция должна быть экспортирована с точно таким же правильным размером. При вызове readConfigFiles в пользовательской библиотеке DLL действий, он должен иметь след как это:

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

Вы можете использовать параметр hInstaller для чтения свойств от MSI. Используйте 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); 
} 

Тогда просто убедитесь, что вы установите свойство в файле .wxs:

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

& cch_value является длина буфера (в случае, если кто-то еще интересно, я должен был вырыть немного, чтобы найти это вне;) Есть еще несколько подробных примеров, но «трюк», который я нашел, если вы не знаете, что длина - это вызов MsiGetProperty с bufferLen = 0, что не получается, потому что недостаточно места для хранения значение, но также заполняет bufferLen тем, сколько места требуется для хранения фактического значения. Вызов MsiGetProperty снова (чтобы выделить значение = TCHAR [bufferLen + 1] с +1, чтобы освободить место для нуль-терминатора) вернет фактическое значение. – glenneroo

+1

Да, cch - венгерская нотация Microsoft для «Count of Chararacters», в отличие от cb, которая является «Count of Bytes». –

+0

И да, это [документальное поведение] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx). Win32 и оболочка были довольно последовательны в соответствии с этим шаблоном. –

Смежные вопросы