检测是否在Windows中注册了OCX类

时间:2010-10-29 17:23:13

标签: delphi ocx

我需要知道如何检测是否在Windows中注册了OCX类(ClassID)

类似

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

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

3 个答案:

答案 0 :(得分:8)

您可以检查Windows注册表中CLSIDHKEY_CLASSES_ROOT的存在。

检查此示例

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;

答案 1 :(得分:2)

ActiveX / COM是一个复杂的野兽,注册有许多部分,而Vista +向前使其更加复杂的UAC注册表虚拟化规则。

最好的选择是简单地尝试实例化OCX并查看它是成功还是失败。这将告诉您OCX是否已正确注册,所有部分是否已连接,OCX是否甚至可以在主叫用户的上下文中使用等。

答案 2 :(得分:2)

抓取注册表的(很多很多)建议的问题是:

  • 您需要查看多个注册表位置
  • 一个类可以注册,但在注册表中不存在

Registration-free COM允许一个类在没有注册的情况下可用。从概念上讲,您不想知道某个班级是否"已注册" ,您只是想知道它已注册足以创建。

不幸的是,唯一(也是最好)的方法是创建它:

//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;