静的にリンクされた DLL の DLL 検索パスの変更
ジレンマ:
静的にリンクする場合DLL をアプリケーションに送信すると、通常はアプリケーションのディレクトリ内で DLL が検索されます。ただし、特定のシナリオでは、DLL が同じディレクトリ内に存在しない場合があります。たとえば、「プラグイン」用に指定されたサブフォルダーに存在する可能性があります。
考えられる解決策:
1。動的リンク:
プラグインの機能にアクセスするには、静的リンクの代わりに LoadLibrary() と GetProcAddress() を使用することを検討してください。これにより、指定された場所から DLL をロードする際の柔軟性が高まります。
2.環境変数の変更:
システムの PATH 環境変数にプラグイン フォルダーのパスを追加すると、DLL を見つけて正常にロードできるようになります。
3.遅延ロード メカニズム:
遅延ロード メカニズムを使用して、プラグイン機能のロードを延期します。提供されたパスを利用して DLL をロードするカスタム ヘルパー関数を実装します。
4.アセンブリの作成:
プラグイン フォルダー内に .manifest ファイルを生成して、プラグイン フォルダーをアセンブリに変換します。 「plugins」フォルダーをアプリケーション内の依存アセンブリとして指定します。これにより、プラグイン フォルダー内の DLL 検索が指示されます。
5.スタブ アプリケーションと動的ロード:
アプリケーションをスタブ実行可能ファイルと動的にロードされるコンポーネントに分割します。スタブ実行可能ファイル内で、SetDllDirectory を使用してプラグイン フォルダーを指定します。次に、LoadLibrary を呼び出して、「appstub.dll」ファイルへの完全なパスを渡します。
追加のヒント:
フォルダーをアセンブリに変える:
DLL を含むディレクトリをアセンブリに変換するには、次の内容を含む "[folder_name].manifest" という名前のファイルをフォルダーに追加します:
<assembly manifestVersion="1.0"> <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" /> <file name="Plugin.dll"/> </assembly>
プラグマ ディレクティブDLL 読み込みの場合:
Visual Studio 7 以降では、次のプラグマ ディレクティブを使用して、ローカル ディレクトリではなくアセンブリから DLL を取得するようにアプリケーションに指示します:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' \ processorArchitecture='*' version='1.0.0.0' \ type='win32'\"")
以上がDLL がアプリケーション ディレクトリにない場合に、静的にリンクされた DLL の DLL 検索パスを変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。