سؤال

أحتاج إلى معرفة كيف يمكن اكتشاف ما إذا كان يتم تسجيل فئة OCX (ClassID) في Windows

شيء مثل

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

begin
  if IsClassRegistered('{26313B07-4199-450B-8342-305BCB7C217F}') then
  // do the work
end;
هل كانت مفيدة؟

المحلول

يمكنك التحقق من وجود clsid تحت HKEY_CLASSES_ROOT في سجل Windows.

تحقق من هذه العينة

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;

نصائح أخرى

ActiveX/COM هو وحش معقد ، والتسجيلات لها العديد من القطع ، و Vista+ فصاعدًا تجعله أكثر تعقيدًا مع قواعد المحاكاة الافتراضية في سجل UAC.

الخيار الأفضل هو ببساطة محاولة إنشاء إنشاء OCX ومعرفة ما إذا كان ينجح أو يفشل. سيخبرك ذلك ما إذا كانت OCX مسجلة بشكل صحيح ، يتم توصيل جميع القطع ، ما إذا كان OCX قابلاً للاستخدام في سياق مستخدم الاتصال ، إلخ.

المشكلة مع (العديد من) اقتراحات الزحف في السجل هي:

  • يوجد أكثر من موقع سجل واحد تحتاج إلى النظر إليه
  • يمكن تسجيل الفصل وليس موجودًا في السجل

كوم خالية من التسجيل يسمح للفصل بأن يكون متاحًا دون تسجيله. من الناحية النظرية ، لا تريد أن تعرف ما إذا كان الفصل "مسجل", ، تريد فقط أن تعرف أنه مسجل بما يكفي لإنشاء.

لسوء الحظ ، فإن الطريقة الوحيدة (والأفضل) للقيام بذلك هي إنشائها:

//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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top