Определить, зарегистрирован ли класс 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;