6

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;
4

3 に答える 3

8

Windows レジストリの下にあるCLSIDの存在を確認できます。HKEY_CLASSES_ROOT

このサンプルを確認してください

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;
于 2010-10-29T17:37:47.073 に答える
3

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

  • 確認する必要があるレジストリの場所が複数あります
  • クラスは登録できますが、レジストリには存在しません

登録不要の 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;
于 2015-10-04T03:12:27.723 に答える
2

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

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

于 2010-11-02T19:07:32.477 に答える