2010-04-28 16 views
5

Eski bir WiSE yükleyicisinden bir DLL aldım, çünkü WiX'te çalışmaya çalışıyorum, bu yüzden MSI tabanlı yükleyicilerle DLL çalıştığıma eminim. İşte WiX - Bir CustomAction (DLL) parametrelere geçiriliyor

benim tanımı şöyledir:

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

ve kullanımı:

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

Ben parametrelerinde tam olarak nerede geçirebilirsiniz:

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

Benim C++ işlevi şöyle?

cevap

5

Parametreleri doğrudan iletemezsiniz çünkü bunun çalışması için, işlevinizin tam olarak doğru ayak iziyle dışa aktarılması gerekir.

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

Sen MSI'dan özelliklerini okumak için hInstaller parametresini kullanabilirsiniz: Eğer özel eylemi dll readConfigFiles çağırdığınızda, böyle bir ayak izi olmalıdır. MsiGetProperty() kullanın:

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); 
} 

Sonra sadece size .wxs dosyasında özelliğini ayarlayın emin olun:

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

& cch_value başka durumda birisi tampon uzunluğu (i bulmak için biraz kazmak zorunda kaldı, merak olduğunu Bu dışarı;) Orada birkaç daha derinlikli örnekler var ama ben uzunluğunu bilmiyorsanız bir "hile" bulduğum MsiGetProperty bufferLen = 0 ile çağırmak, çünkü saklamak için yeterli alan yok çünkü bir değer ama aynı zamanda bufferLen'i gerçek değeri depolamak için ne kadar alana ihtiyaç duyduğunu da doldurur. MsiGetProperty'yi tekrar çağırmak (boş değer sonlandırıcı için yer açmak için değer = TCHAR [bufferLen + 1] +1 ile ayırdığınızdan emin olmak) gerçek değeri döndürecektir. – glenneroo

+1

Evet, cch, Microsoft'un "Bayt Sayısı" olan cb'den farklı olarak "CHacaters Sayımı" için Macar notalarıdır. –

+0

Ve evet, bu [belgelenmiş davranış] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx). Win32 ve kabuk bu desen takip oldukça tutarlıydı. –