我需要知道如何检测是否在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;
答案 0 :(得分:8)
您可以检查Windows注册表中CLSID下HKEY_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;