2

レジストリで利用可能な情報を解析するだけで、登録されたCOMコンポーネントがスタンドアロンコンポーネントとして作成可能かどうかを判断する方法はありますか?特に、HKCR / ClsIdにある情報によって?

私のシステムにはこのキーに12,000を超えるエントリがあり、InProcServer32またはLocalServer32キーを持たないアイテムはすでに除外していますが、これではアイテムの約半分しか削除されません。作成可能なオブジェクトではないものがまだ数千あると思います。作成できるものと作成できないものを区別するために、それらすべてに対してCreateObject()を実行しようとする必要は本当にありません。より効率的な方法はありますか?

4

2 に答える 2

4

オレビュー

私 はこの目的のためにOleviewを使用しました(当時は:))

手動/プログラマティック

私が正しく覚えている場合(近くにWindows PCがない):

  • クラスはタイプライブラリにリンクする必要があります
  • typelibはバイナリ(dll、ocx、exe)を指します
  • このバイナリには、解析する必要のある物理タイプライブラリが含まれています
    • midlコンパイラはそれを行うことができます(スタブ/ Cヘッダーを生成します)
    • oleviewはそれを行うことができます(IDLを抽出します)
    • tlbimpはそれを行うことができます
    • あなたはWin32APIでそれを行うことができます
    • 作成可能なオブジェクトにはマークを付ける必要がありますcoclassinterfaceまたはsource;作成可能であると思われるグローバルモジュールもありました:それらが剰余類として定義されているかどうかはわかりません

コードを見せて

ITypeLibおよびITypeInfoインターフェイスを使用して、タイプライブラリ内の情報を読み取ることができます。これらは、ICreateTypeLibおよびICreateTypeInfoインターフェイスを使用して作成できます。ただし、Microsoft IDLコンパイラ(MIDL)は、おそらくICreateTypeおよびICreateTypeInfoを使用する唯一のアプリケーションです。

簡単なグーグルがこの便利なページを見つけました:C++でタイプライブラリを読む

開始するためのコードのみが含まれています何か価値があるかどうかを確認するために、クラウドWindowsインスタンスを起動し、すべてのソースを取得してコンパイルしました。

サイトに記載されているオプションとは対照的に、私は単にウィンドウでコンパイルしました

cl.exe *.cpp /EHs ole32.lib oleaut32.lib

楽しみのために、MingWを使用してLinux(64ビット)でコンパイルしました。

i586-mingw32msvc-g++ *.cpp -loleaut32 -lole32 -o Typelib.exe

作業を保存するために、以下を含むzipファイルをダウンロード用に用意しました。

win32_Unicode.cpp     - sources by René Nyffenegger
win32_Unicode.h
TestTypelib.cpp
Typelib.cpp
Typelib.h
VariantHelper.cpp
VariantHelper.h
TestTypelib.exe       - binary compiled on windows

テスト実行:

# linux: ./a.exe ~/.wine/drive_c/windows/system32/msxml6.dll
C:\Games\Stacko>TestTypelib.exe c:\Windows\System32\msxml6.dll

MSXML2: Microsoft XML, v6.0
Nof Type Infos: 149

IXMLDOMImplementation
----------------------------
  Interface: Dispatch
  functions: 8
  variables: 0

  Function     : QueryInterface
    returns    : VT_VOID
    flags      : 
    invoke kind: function
    params     : 2
    params opt : 0
    Parameter  : riid type = VT_PTR (VT_USERDEFINED (GUID)) in
    Parameter  : ppvObj type = VT_PTR (VT_PTR) out

  Function     : AddRef
    returns    : VT_UI4
    flags      : 
    invoke kind: function
    params     : 0
    params opt : 0

(snip)および15499行以上

結論

これにより、システムをスキャンして、インストールされた作成可能なCOMコンポーネントを探すための良い出発点になることを願っています。

于 2011-07-12T21:28:34.537 に答える
1

「作成可能」の意味によって異なります。LocalServer32またはキーがある場合は、InprocServer32ローカルで作成できる必要があります。AppIDがあり、AppIDにLocalServiceまたはRemoteServerキーがある場合は、リモートで作成することもできます。

ただし、レジストリを参照すると、「作成可能である必要があるように見えますか」という質問にしか答えられません。

それでも作成できない場合があります。

  • 登録が壊れているか、アンインストールされたコンポーネントからの「化石」レジストリエントリが壊れている可能性があります。
  • コンポーネントは、意図的に文書化されていないため、使用方法がわからない、ある種の内部Windowsコンポーネントである可能性があります。
  • コンポーネントは、文書化されていない追加の要件がある、インストールされたアプリケーションの内部コンポーネントである可能性があります。
  • 許可がない可能性があります。

作成できる他のコンポーネントがあるかもしれません:

  • WSCスクリプトレットなどの登録不要のCOMコンポーネントが存在する可能性があります。
  • 登録不要のCOMDLLが存在する可能性があります。COMコンポーネントになるには登録する必要があるという法律はありません。登録は、ほとんどの人が選択するオプションのサービスです。

したがって、答えは、レジストリを使用してほぼ完全なリストを取得できるはずですが、リストは何のためのものですか?

リストが何のために欲しいのかを知らなければ、リストが十分に良いかどうかを知ることは不可能です。

于 2012-02-28T11:12:29.340 に答える