2011-02-11 7 views
9

मुझे यह जांचने की ज़रूरत है कि msdia100.dll कंप्यूटर सिस्टम पर पंजीकृत है या नहीं, जिसे मैं regsvr32.exe कमांड के साथ डीएल पंजीकृत करने के लिए चला रहा हूं। मैं सी # के साथ ऐसा कैसे कर सकता हूं?COM dll को कैसे जांचें सी # के साथ पंजीकृत है या नहीं?

उत्तर

3

आप इसके लिए रजिस्ट्री के माध्यम से खोज सकते हैं। यह मानते हुए कि आप डीएलएल में निहित COM ऑब्जेक्ट्स को नहीं जानते हैं, आपको पहले डीएलएल नाम को HKEY_CLASSES_ROOT में देखना शुरू करना होगा।

फिर HKEY_CLASSES_ROOT\[ClassName]\CLSID में सीएलएसआईडी खोजने के लिए कक्षा के नाम का उपयोग करें और अंततः आपको इसे CLSID HKEY_CLASSES_ROOT\CLSID\[CLSID] के रूप में ढूंढने में सक्षम होना चाहिए।

कृपया ध्यान दें, स्मृति से लिखी गई रजिस्ट्री स्थानें थोड़ी दूर हो सकती हैं।

संपादित करें: या यदि आप कक्षा का नाम जानते हैं तो आप बस इसका एक उदाहरण बनाने की कोशिश कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं।

1

HKEY_CLASSES_ROOT \ CLSID \\ InprocServer पर rgistry को देखें। यदि आपके पास वह रिकॉर्ड है, तो डीएलएल पंजीकृत होना चाहिए।

-1

यह करने का यह सही तरीका है। इसमें 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);  
} 
+0

मुझे विश्वास नहीं है कि यह बिल्कुल सही है। यह किसी भी * डीएलएल लोड करता है, भले ही यह एक COM ऑब्जेक्ट होस्ट करने के रूप में पंजीकृत है या नहीं। –

+0

@Steve, आप नाम से एक डीएल लोड कर रहे हैं और पूर्ण पथ नहीं। यदि डीएलएल लोड करता है तो यह पंजीकृत हो गया है। यदि नहीं, तो यह पंजीकृत नहीं है। जब तक आप जिस डीएल की तलाश में हैं, वह भी आपके रास्ते में नहीं होता है। –

+0

बस स्पष्ट होने के लिए, लोड लाइब्रेरी के बाद DllGetClassObject (सीएलएसआईडी और इंटरफ़ेस के आईआईडी के साथ) आपको एक COM ऑब्जेक्ट देता है जिसे आप खेल सकते हैं। अगर लोड लाइब्रेरी विफल हो जाती है, तो यह काम नहीं करेगा, अवधि। –

4

रजिस्ट्री दृष्टिकोण ठीक है और कर के लायक हैं, लेकिन यकीन है कि आप भी है, तो वर्तमान कुछ समझदार (COMException) {} एक कोशिश {} पकड़ में लिपटे COM वस्तु के भीतर से कुछ instantiating पर विचार हो सकता होने के लिए यदि कोई कॉमेक्सप्शन पकड़ा गया तो उपयोगकर्ता।

+0

विशेष रूप से रजिस्ट्री यह दिखने से कहीं अधिक जटिल है, इम्यूलेशन की विभिन्न परतों, 32/64-बिट और इसी तरह के कारण। –

2

सत्यापित करें यदि कुंजी 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; 
4

मान लिया जाये कि आप 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

मैं वास्तव में आपके उत्कृष्ट कोड की सराहना करता हूं। आपको बहुत - बहुत धन्यवाद ! –

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