PE(DLL / EXE)を入力として指定すると、それが通常のWin32 DLL/EXEであるかCOMDLL/EXEであるかを判別するスタブモジュールを作成する必要があります。これをプログラムで決定する必要があります。
この目的のためのWindowsAPIはありますか?
PE(DLL / EXE)を入力として指定すると、それが通常のWin32 DLL/EXEであるかCOMDLL/EXEであるかを判別するスタブモジュールを作成する必要があります。これをプログラムで決定する必要があります。
この目的のためのWindowsAPIはありますか?
従来の COM DLL の場合、よく知られたエクスポートされたメソッドを探すことができます (これらのメソッドについては msdn で検索してください)。
ただし、EXE COM サーバーは通常、登録/登録解除にコマンド ライン パラメータを使用し、EXE の起動時にクラス オブジェクトが通常 CoRegisterClassObject を呼び出すため、よくわかりません。
従来、ほとんどの COM サーバーはレジストリにも登録されていましたが、現在は登録不要のサーバーを作成できます。
いくつかの COM 可視クラスを含む .NET アセンブリもお探しですか?
これは、ほぼ 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 を使用しているか、まだ登録されていない可能性があります。
それが役立つことを願っています。