मुझे यह जांचने की ज़रूरत है कि msdia100.dll कंप्यूटर सिस्टम पर पंजीकृत है या नहीं, जिसे मैं regsvr32.exe
कमांड के साथ डीएल पंजीकृत करने के लिए चला रहा हूं। मैं सी # के साथ ऐसा कैसे कर सकता हूं?COM dll को कैसे जांचें सी # के साथ पंजीकृत है या नहीं?
उत्तर
आप इसके लिए रजिस्ट्री के माध्यम से खोज सकते हैं। यह मानते हुए कि आप डीएलएल में निहित COM ऑब्जेक्ट्स को नहीं जानते हैं, आपको पहले डीएलएल नाम को HKEY_CLASSES_ROOT
में देखना शुरू करना होगा।
फिर HKEY_CLASSES_ROOT\[ClassName]\CLSID
में सीएलएसआईडी खोजने के लिए कक्षा के नाम का उपयोग करें और अंततः आपको इसे CLSID HKEY_CLASSES_ROOT\CLSID\[CLSID]
के रूप में ढूंढने में सक्षम होना चाहिए।
कृपया ध्यान दें, स्मृति से लिखी गई रजिस्ट्री स्थानें थोड़ी दूर हो सकती हैं।
संपादित करें: या यदि आप कक्षा का नाम जानते हैं तो आप बस इसका एक उदाहरण बनाने की कोशिश कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं।
HKEY_CLASSES_ROOT \ CLSID \\ InprocServer पर rgistry को देखें। यदि आपके पास वह रिकॉर्ड है, तो डीएलएल पंजीकृत होना चाहिए।
यह करने का यह सही तरीका है। इसमें PInvoke शामिल है लेकिन यह 'केवल इसलिए कि उन्होंने इस क्षमता को .NET में सीधे प्रदान नहीं किया है।
[DllImport("kernel32")]
public extern static int LoadLibrary(string lpLibFileName);
[DllImport("kernel32")]
public extern static bool FreeLibrary(int hLibModule);
public bool IsDllRegistered(string DllName)
{
int libId = LoadLibrary(DllName);
if (libId>0) FreeLibrary(libId);
return (libId>0);
}
रजिस्ट्री दृष्टिकोण ठीक है और कर के लायक हैं, लेकिन यकीन है कि आप भी है, तो वर्तमान कुछ समझदार (COMException) {} एक कोशिश {} पकड़ में लिपटे COM वस्तु के भीतर से कुछ instantiating पर विचार हो सकता होने के लिए यदि कोई कॉमेक्सप्शन पकड़ा गया तो उपयोगकर्ता।
विशेष रूप से रजिस्ट्री यह दिखने से कहीं अधिक जटिल है, इम्यूलेशन की विभिन्न परतों, 32/64-बिट और इसी तरह के कारण। –
सत्यापित करें यदि कुंजी Microsoft.Win32.RegistryKey
var key = Microsoft.Win32.RegistryKey.OpenBaseKey(
Microsoft.Win32.RegistryHive.ClassesRoot,
Microsoft.Win32.RegistryView.Default)
.OpenSubKey("Interface")
//replace with your COM object GUID
.OpenSubKey("{a3560000-0000-0000-c63b3-000000cbadf0000}");
return key != null;
मान लिया जाये कि आप COM dll की CLSID पता का उपयोग कर मौजूद है, तो आप सिर्फ पर कि CLSID के साथ एक चाबी है या नहीं की जाँच कर सकते HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}
या HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}
(Wow6432Node => 64-बिट मशीन पर पंजीकृत 32-बिट COM)
उदा।
private bool IsAlreadyRegistered()
{
using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey(
Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default))
{
const string clsid = "{12345678-9012-3456-7890-123456789012}";
var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ??
classesRootKey.OpenSubKey(@"CLSID\" + clsid);
if (clsIdKey != null)
{
clsIdKey.Dispose();
return true;
}
return false;
}
}
मैं वास्तव में आपके उत्कृष्ट कोड की सराहना करता हूं। आपको बहुत - बहुत धन्यवाद ! –
- 1. बिल्ड सर्वर पर COM संदर्भित DLL को पंजीकृत करना
- 2. मैं Regsvr32 के साथ सी # में लिखित एक COM DLL कैसे पंजीकृत करूं?
- 3. COM प्रोग्राम कैसे COM इंटरॉप के लिए पंजीकृत .NET DLL का पता लगाता है?
- 4. COM msado15.dll प्रोग्राम
- 5. मैं कैसे जांचूं कि एक COM dll C#
- 6. एक COM dll
- 7. स्थानीय COM DLL
- 8. COM पंजीकृत .dll को प्रतिस्थापित करते समय .NET क्लाइंट क्रैश क्लाइंट
- 9. जो "बेहतर" है: COM DLL या मानक डीएलएल एक टाइपेलिब के साथ?
- 10. मेरे सी ++ प्रोग्राम में COM dll का उपयोग कैसे करें
- 11. आप Win32 COM DLL फ़ाइल को WiX 3 में कैसे पंजीकृत करते हैं?
- 12. Regasm के माध्यम से पंजीकृत कई संस्करणों के साथ .NET/COM कैसे काम करता है?
- 13. सी # COM DLL: क्या मैं Regasm, या Regsvr32 का उपयोग करता हूँ?
- 14. COM क्लाइंट में COM को संदर्भित नहीं कर सकता है?
- 15. COM के रूप में .NET असेंबली को कैसे पंजीकृत करें?
- 16. सी # के साथ रेग फ्री COM इंटरऑप, संभव है?
- 17. .NET में, क्या DLL को पंजीकृत करने की आवश्यकता है?
- 18. पारंपरिक डीएलएल और COM DLL
- 19. 32 बिट COM DLL को 64 बिट विंडोज 7
- 20. यदि कोई फ़ंक्शन मौजूद है तो DLL को कैसे जांचें?
- 21. सभी उपयोगकर्ताओं के लिए COM ऑब्जेक्ट कैसे पंजीकृत करें
- 22. क्या वीएस के बिना COM दृश्य प्रकार वाले .NET DLL को ऊंचाई बनाना आवश्यक है?
- 23. मेल पता कैसे जांचें या नहीं है?
- 24. SQLite कॉलम में कोई मान कैसे जांचें पूर्ण या सी एपीआई के साथ नहीं है?
- 25. CoCreateInstance रिटर्न "क्लास नहीं पंजीकृत"
- 26. कक्षा पंजीकृत नहीं है (HRESULT से अपवाद: 0x80040154 (REGDB_E_CLASSNOTREG))
- 27. सी # - कैसे जांचें कि नामस्थान, कक्षा या विधि सी # में मौजूद है या नहीं?
- 28. स्ट्रिंग को कैसे जांचें यदि यह ASCII है या नहीं?
- 29. जांचें कि उपयोगकर्ता सी में रूट है या नहीं?
- 30. वाईएक्स: पंजीकृत .NET COM घटक दोनों x86 x64
मुझे विश्वास नहीं है कि यह बिल्कुल सही है। यह किसी भी * डीएलएल लोड करता है, भले ही यह एक COM ऑब्जेक्ट होस्ट करने के रूप में पंजीकृत है या नहीं। –
@Steve, आप नाम से एक डीएल लोड कर रहे हैं और पूर्ण पथ नहीं। यदि डीएलएल लोड करता है तो यह पंजीकृत हो गया है। यदि नहीं, तो यह पंजीकृत नहीं है। जब तक आप जिस डीएल की तलाश में हैं, वह भी आपके रास्ते में नहीं होता है। –
बस स्पष्ट होने के लिए, लोड लाइब्रेरी के बाद DllGetClassObject (सीएलएसआईडी और इंटरफ़ेस के आईआईडी के साथ) आपको एक COM ऑब्जेक्ट देता है जिसे आप खेल सकते हैं। अगर लोड लाइब्रेरी विफल हो जाती है, तो यह काम नहीं करेगा, अवधि। –