function IsClassRegistered(ClassID:string):boolean; begin //the magic goes here end; begin if IsClassRegistered('{26313B07-4199-450B-8342-305BCB7C217F}') then // do the work end;
6
1
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;