3

私はプラグインベースのアーキテクチャを備えたプログラムに取り組んでいます。すべてのプラグインはDLLであり、一部のプラグインは他のプラグインDLLに依存する可能性があります。次のことができるようになりたいです。

  • プログラムの起動時に、pluginsフォルダーをスキャンします。
  • 見つかったプラグインごとに、そのプラグインがすでにロードされているかどうかを確認します。(以前にロードされたプラグインが依存関係としてロードされた場合、それは可能性があります)。
  • そうでない場合は、ロードします。

最初と3番目のステップは簡単ですが、2番目のステップを実行するにはどうすればよいですか?DLLのファイル名を指定すると、そのDLLが現在のプロセスに現在ロードされているかどうかを通知するwinapi呼び出しはありますか?(または、ファイル名とプロセスハンドルを使用するものですか?)

「とにかくロードするだけ」という答えはありません。私はそれがうまくいくことを知っています。私はそれを避けようとしています。

4

1 に答える 1

5

GetModuleHandleAPIはHMODULE、ロードされたDLLを提供します。ロードされていない場合は、NULLを提供します。必要に応じて、パスを省略できることに注意してください。HMODULEパスなしで名前を取得し、GetModuleFileNameこのハンドルを使用してフルパスを取得し、期待するものと比較することもできます。

lpModuleNameにパスが含まれておらず、同じベース名と拡張子を持つロードされたモジュールが複数ある場合、どのモジュールハンドルが返されるかを予測することはできません。この問題を回避するには、パスを指定するか、サイドバイサイドアセンブリを使用するか、GetModuleHandleExを使用してDLL名ではなくメモリの場所を指定します。

GetModuleHandle関数は、参照カウントをインクリメントせずに、マップされたモジュールへのハンドルを返します。ただし、このハンドルがFreeLibrary関数に渡されると、マップされたモジュールの参照カウントが減少します。したがって、GetModuleHandleによって返されたハンドルをFreeLibrary関数に渡さないでください。これを行うと、DLLモジュールが時期尚早にマップ解除される可能性があります。

を使用してプロセスでロードされたライブラリを列挙するEnumProcessModulesことも可能ですが、説明したタスクでは少しやり過ぎかもしれません。がなくても、これらの単純で単純な関数でうまくいくかもしれませんPSAPI

于 2012-08-13T17:33:44.033 に答える