2010-10-29 12 views
6

में पंजीकृत है मुझे पता करने के लिए कैसे पता लगा सकते हैं अगर एक OCX वर्ग (ClassID)का पता लगाने अगर एक OCX वर्ग विंडोज

की तरह कुछ

function IsClassRegistered(ClassID:string):boolean; 
begin 
//the magic goes here 
end; 

begin 
    if IsClassRegistered('{26313B07-4199-450B-8342-305BCB7C217F}') then 
    // do the work 
end; 
+1

चेतावनी दी जानकारी होनी चाहिए कि इसका मतलब यह नहीं है वास्तविक ocx डिस्क पर और सही स्थान में है। और फिर भी इसका मतलब यह नहीं है कि ओसीएक्स समस्याओं के बिना लोड किया जा सकता है। और चूंकि पंजीकरण मुफ्त कॉम है (http://msdn.microsoft.com/en-us/library/ms973913.aspx) यह भी नहीं बताता कि ओसीएक्स संभावित रूप से प्रयोग योग्य है या नहीं। –

उत्तर

8

Windows में registred है आप के अस्तित्व की जाँच कर सकते की जरूरत है विंडोज रजिस्ट्री में HKEY_CLASSES_ROOT के तहत CLSID

जांच इस नमूने

function ExistClassID(const ClassID :string): Boolean; 
var 
    Reg: TRegistry; 
begin 
try 
    Reg := TRegistry.Create; 
    try 
    Reg.RootKey := HKEY_CLASSES_ROOT; 
    Result  := Reg.KeyExists(Format('CLSID\%s',[ClassID])); 
    finally 
    Reg.Free; 
    end; 
except 
    Result := False; 
end; 
end; 
2

ActiveX/COM एक जटिल जानवर है, पंजीकरण उन्हें कई टुकड़े हैं, और Vista + आगे इसे और अधिक यूएसी रजिस्ट्री वर्चुअलाइजेशन नियमों के साथ जटिल बना।

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

1

रजिस्ट्री को क्रॉल करने के कई (कई, कई) सुझावों के साथ समस्या है कि:

  • एक से अधिक रजिस्ट्री स्थान आप
  • की किसी कक्षा पंजीकृत किया जा सकता देखने के लिए और रजिस्ट्री

Registration-free COM में मौजूद नहीं की आवश्यकता होगी है की अनुमति देता है एक वर्ग इसके बिना उपलब्ध होने की आर होना egistered। संकल्पनात्मक रूप से आप यह नहीं जानना चाहते कि कोई वर्ग "पंजीकृत" है, तो आप बस जानना चाहते हैं कि यह पर्याप्त रूप से पंजीकृत है।

दुर्भाग्य से केवल (और सबसे अच्छा) तरीका है कि ऐसा करने के लिए इसे बनाने के लिए है:

//Code released into public domain. No attribution required. 
function IsClassRegistered(const ClassID: TGUID): Boolean; 
var 
    unk: IUnknown; 
    hr: HRESULT; 
begin 
    hr := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, {out}unk); 
    unk := nil; 

    Result := (hr <> REGDB_E_CLASSNOTREG); 
end; 
संबंधित मुद्दे