2010-04-28 31 views
5

Tôi đã có một DLL từ một trình cài đặt WiSE cũ mà tôi đang cố gắng để làm việc trong WiX, vì vậy tôi khá chắc chắn DLL làm việc với các trình cài đặt dựa trên MSI.WiX - Truyền tham số cho một CustomAction (DLL)

Dưới đây là định nghĩa của tôi:

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

và cách dùng:

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

My C++ chức năng trông như thế này:

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

tôi có thể vượt qua ở đâu chính xác trong thông số?

Trả lời

5

Bạn không thể chuyển trực tiếp tham số vì để làm việc này, chức năng của bạn phải được xuất với đúng dấu chân phải. Khi bạn gọi readConfigFiles trong dll hành động tùy chỉnh của bạn, nó sẽ có một dấu chân như thế này:

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

Bạn có thể sử dụng tham số hInstaller để đọc tài sản từ MSI. Sử dụng 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); 
} 

Sau đó chỉ cần chắc chắn rằng bạn thiết lập thuộc tính trong .wxs tập tin của bạn:

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

& cch_value là chiều dài đệm (trong trường hợp ai đó đang tự hỏi, tôi đã phải đào một chút để tìm này ra;) Có một vài ví dụ chuyên sâu hơn ở đó nhưng một "thủ thuật" tôi tìm thấy nếu bạn không biết chiều dài là để gọi MsiGetProperty với bufferLen = 0, mà không thành công vì không có đủ không gian để lưu trữ một giá trị nhưng nó cũng lấp đầy bufferLen với bao nhiêu không gian là cần thiết để lưu trữ giá trị thực tế. Gọi lại MsiGetProperty (đảm bảo phân bổ giá trị = TCHAR [bufferLen + 1] với +1 để nhường chỗ cho một null-terminator) sẽ trả về giá trị thực. – glenneroo

+1

Vâng, cch là ký hiệu Hungary của Microsoft cho "Count of Characters", trái ngược với cb là "Count of Bytes". –

+0

Và có, đó là [hành vi được ghi lại] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx). Win32 và vỏ khá phù hợp theo mô hình này. –

Các vấn đề liên quan