4

PE(DLL / EXE)を入力として指定すると、それが通常のWin32 DLL/EXEであるかCOMDLL/EXEであるかを判別するスタブモジュールを作成する必要があります。これをプログラムで決定する必要があります。

この目的のためのWindowsAPIはありますか?

4

2 に答える 2

0

従来の COM DLL の場合、よく知られたエクスポートされたメソッドを探すことができます (これらのメソッドについては msdn で検索してください)。

  1. DllGetClassObject
  2. DllRegisterServer
  3. DllUnregisterServer
  4. DllCanUnloadNow

ただし、EXE COM サーバーは通常、登録/登録解除にコマンド ライン パラメータを使用し、EXE の起動時にクラス オブジェクトが通常 CoRegisterClassObject を呼び出すため、よくわかりません。

従来、ほとんどの COM サーバーはレジストリにも登録されていましたが、現在は登録不要のサーバーを作成できます。

いくつかの COM 可視クラスを含む .NET アセンブリもお探しですか?

于 2010-04-21T08:54:01.507 に答える
0

これは、ほぼ 100% の精度で行うのは非常に難しいことだと思います。ただし、いくつかの考え:

  • COM DLL は、DllRegisterServer や DllUnregisterServer などの関数をエクスポートします。LoadLibrary() を使用して Dll をロードし、次に GetProcAddress() を使用してこれらの関数の存在を確認できます。それらが存在する場合、COM dll である可能性が非常に高くなります。

  • 通常の win32 Dll は DllMain をエクスポートします。同じ手法を使用して、それを確認できます。見つかった場合は、win32 である可能性が非常に高くなります。

  • exeがCOMサーバーであるかどうかを発見する方法を知りません。ATL を使用して作成されたサーバーには、多くの場合、リソース テーブルに登録スクリプトが埋め込まれていますが、必須ではありません。また、COM サーバーを作成するために ATL を使用する必要はありません。"registry-less com" を使用するサービスには、同様にマニフェストが埋め込まれます。レジストリ (HKLM/Classes/Software/ の下) をスキャンして、exe が登録されているかどうかを確認できますが、exe がレジストリのない com を使用しているか、まだ登録されていない可能性があります。

それが役立つことを願っています。

于 2010-04-21T08:54:39.413 に答える