Определить, зарегистрирован ли класс OCX в Windows - PullRequest
6 голосов
/ 29 октября 2010

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

8 голосов
/ 29 октября 2010

вы можете проверить наличие 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;
2 голосов
/ 04 октября 2015

Проблема с (многими, многими) предложениями по сканированию реестра заключается в следующем:

  • есть несколько мест в реестре, которые вам нужно посмотреть
  • класс может быть зарегистрирован и не существует в реестре

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;
2 голосов
/ 02 ноября 2010

ActiveX / COM - сложный зверь, у регистраций есть много частей, и Vista + вперед усложняет правила виртуализации реестра UAC.

Лучший вариант - просто попытаться создать экземпляр OCX и увидетьесли это удастся или не удастся.Это скажет вам, правильно ли зарегистрирован OCX, подключены ли все части, можно ли использовать OCX даже в контексте вызывающего пользователя и т. Д.

...