6


1

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 Answer


8


CLSIDの存在をhttp://msdn.microsoft.com/en-usで確認できます。 /library/ms724475%28VS.85%29.aspx [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


ActiveX / COMは複雑な獣であり、登録には多くの要素があり、Vista +以降ではUACレジストリ仮想化ルールにより複雑になります。

最良のオプションは、単にOCXをインスタンス化し、成功または失敗するかどうかを確認することです。 これにより、OCXが正しく登録されているかどうか、すべてのピースが接続されているかどうか、OCXが呼び出しユーザーのコンテキスト内で使用可能かどうかなどがわかります。


1


レジストリのクロールに関する(多くの、多くの)提案の問題は次のとおりです。

  • 調べる必要があるレジストリの場所は複数あります

  • クラスは登録できますが、レジストリに存在しません

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;