2009-09-07 12 views
5
इसके बजाय regsvr32.exe बुलाने की

, एक एक .DLL निम्न चरणों का उपयोग रजिस्टर कर सकते हैं:प्रोग्राम के पंजीकरण के Windows Vista पर .dll के (DllRegisterServer का प्रयोग करके)

HINSTANCE hLib = ::LoadLibraryEx(dllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 
HRESULT (STDAPICALLTYPE* lpDllEntryPoint)(void); 
(FARPROC&)lpDllEntryPoint = ::GetProcAddress(hLib, "DllRegisterServer"); 
const HRESULT hRes = (*lpDllEntryPoint)(); 

यह Windows XP पर ठीक काम करता है। अफसोस की बात है, यह Vista पर विफल रहता है, लेकिन केवल कुछ विशिष्ट DLLs के साथ। hResE_ACCESSDENIED बन जाता है। मुझे लगता है कि यह एक सुरक्षा मुद्दा है। क्या किसी को पता है कि विंडोज विस्टा पर कोड से डीएलएल कैसे पंजीकृत करें?

नोट: मैं इस कोड को चलाने के दौरान व्यवस्थापक के रूप में लॉग इन था।

उत्तर

5

COM पंजीकरण के लिए रजिस्ट्री के HKEY_LOCAL_MACHINE भाग के लिए लेखन पहुंच की आवश्यकता है।

यूएसी के तहत, HKEY_LOCAL_MACHINE तक पहुंच लिखने के लिए उन्नत व्यवस्थापक की आवश्यकता है।

एक उन्नत प्रक्रिया प्राप्त करने का सबसे आसान तरीका यह एक मैनिफेस्ट के साथ बनाना है जो 'आवश्यकता प्रशासक' पहुंच निर्दिष्ट करता है। - परियोजना गुणों के अंतर्गत देखें -> कॉन्फ़िगरेशन गुण-> लिंकर-> मैनिफेस्ट फ़ाइल-> सही सेटिंग सेट करने के लिए यूएसी निष्पादन स्तर।

इसका मतलब है कि आप शायद अपने EXE को दो भागों में विभाजित करना चाहते हैं। इनवॉकर भाग के रूप में 'सामान्य', और, जब स्वयं पंजीकरण एक आवश्यकता के रूप में पता चला है, एक उन्नत InstallMyself भाग। जब गैर उन्नत भाग पहली बार चलने वाली स्थिति का पता लगाता है, तो इसे CreateInrocall.exe भाग निष्पादित करने के लिए ShellExecute (Ex) का उपयोग करने की आवश्यकता होती है - CreateProcess का उपयोग करके या कुछ अन्य API बस अपर्याप्त विशेषाधिकार त्रुटि के साथ विफल हो जाएंगे। ShellExecute यूएसी प्रॉम्प्ट पेश करेगा।

किसी भी पंजीकरण चरण के बिना COM dll लोड करने के लिए Application Isolation का उपयोग करना संभव है।


दुर्भाग्यपूर्ण है कि कारण निर्धारित नहीं किया जा सकता है। हालांकि, यदि आप आगे शोध करने में रुचि रखते हैं, तो एक उपकरण जो बहुत मदद करेगा SysInternals से प्रोसेस मॉनीटर होगा। प्रक्रिया मॉनिटर सभी फ़ाइल, रजिस्ट्री और प्रक्रिया के लिए अन्य पहुंच को लॉग कर सकता है, जिसमें सभी सफलता और असफल कोड शामिल हैं, जिससे रिवर्स इंजीनियरिंग के गहरे माध्यमों का सहारा लेने के बिना इस तरह की समस्याओं को डीबग करना बहुत आसान हो जाता है।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। अफसोस की बात है, यह मेरी समस्या का समाधान नहीं करता है, क्योंकि मैं यूएसी मोड में भी नहीं चल रहा था। –

+0

यह कॉम डीएल के साथ एक विशिष्ट मुद्दा होगा/जिसे आप पंजीकरण करने का प्रयास कर रहे हैं। कोई वास्तविक कारण नहीं है कि एक उन्नत प्रशासक खाते से सीधे पंजीकृत होने पर Vista के तहत कॉम डीएल विफल होना चाहिए। शायद regsvr32.exe DllRegisterServer को कॉल करने से पहले COM अपार्टमेंट प्रारंभ करता है? (यानी आपको CoInitialize को कॉल करने की आवश्यकता है?) यदि आपने अपना कॉम डीएल बनाया है और सीधे पंजीकरण कोड को डीबग किया है तो मुझे यकीन है कि आपको कोई समस्या नहीं दिखाई देगी। –

+0

आप सही हैं! समस्या केवल कुछ डीएलएल के साथ होती है। जाहिर है, कोड का दिया गया टुकड़ा अधिकांश डीएलएल के लिए अच्छा काम करता है। –

1

अफसोस की बात है, मैं इसे सभी DLLs के लिए काम करने के लिए नहीं मिला, यहां तक ​​कि Chris Becke's उत्कृष्ट युक्तियों के साथ भी। मैं समस्या को हल करने में ज्यादा समय नहीं बिताना चाहता था, इसलिए अब मैं regsvr32.exe पर कॉल करता हूं। मैं उम्मीद करता हूं कि यह .exe सभी विंडोज मशीनों पर मौजूद होगा, इसलिए मुझे लगता है कि यह एक अच्छा पर्याप्त समाधान है।

संबंधित मुद्दे