اكتشف ما إذا كانت فئة OCX مسجلة في Windows
سؤال
أحتاج إلى معرفة كيف يمكن اكتشاف ما إذا كان يتم تسجيل فئة 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;