2010-04-28 15 views
5

पर पैरामीटर पास करना मुझे पुराने वाईएसई इंस्टॉलर से एक डीएलएल मिला है कि मैं वाईएक्स में काम करने की कोशिश कर रहा हूं, इसलिए मुझे पूरा यकीन है कि डीएलएल एमएसआई-आधारित इंस्टॉलर्स के साथ काम करता है।वाईएक्स - एक कस्टमएक्शन (डीएलएल)

यहाँ मेरी परिभाषा है:

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

और उपयोग:

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

मैं मानकों में कहाँ वास्तव में पारित कर सकते हैं:

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

मेरे सी ++ समारोह इस तरह दिखता है?

उत्तर

5

आप सीधे पैरामीटर पास नहीं कर सकते हैं क्योंकि यह काम करने के लिए, आपके फ़ंक्शन को सही पदचिह्न के साथ निर्यात किया जाना है।

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

आप MSI से गुण पढ़ने के लिए hInstaller पैरामीटर का उपयोग कर सकते हैं: जब आप अपने कस्टम कार्रवाई dll में readConfigFiles कहते हैं, वह इस तरह का पदचिह्न होना चाहिए। 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 बफर लंबाई (किसी और मामले में किसी को सोच रहा है, मैं थोड़ा खुदाई करने के लिए की तलाश करनी है है यह बाहर;) वहां कुछ और गहराई से उदाहरण हैं लेकिन एक "चाल" मैंने पाया है कि अगर आपको पता नहीं है कि एमएसजीटप्रोपर्टी को bufferLen = 0 के साथ कॉल करना है, जो विफल रहता है क्योंकि स्टोर करने के लिए पर्याप्त जगह नहीं है एक मूल्य लेकिन यह वास्तविक मूल्य को स्टोर करने के लिए कितनी जगह की आवश्यकता है, इसके साथ बफरलेन भी भरता है। MsiGetProperty को दोबारा कॉल करना (शून्य/टर्मिनर के लिए कमरा बनाने के लिए +1 = tCHAR [bufferLen + 1] आवंटित करना सुनिश्चित करना) वास्तविक मान वापस कर देगा। – glenneroo

+1

हाँ, सीएच "कैरेक्ट ऑफ गारक्टर्स" के लिए माइक्रोसॉफ्ट के हंगेरियन नोटेशन है, सीबी के विपरीत जो "बाइट्स की गिनती" है। –

+0

और हां, यह एक [दस्तावेज व्यवहार] है (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134 (v = vs.85) .aspx)। Win32 और खोल इस पैटर्न का पालन करने में काफी सुसंगत थे। –