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