Определить, зарегистрирован ли класс 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;
3 ответов
вы можете проверить наличие 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 даже в контексте вызывающего пользователя и т. д.
проблема с (многими, многими) предложениями обхода реестра заключается в том, что:
- существует более одного местоположения реестра вам нужно будет посмотреть на
- класс может быть зарегистрирована и не существует в реестре
Регистрация-бесплатный 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;