ホームページ >バックエンド開発 >C++ >DLL がアプリケーション ディレクトリにない場合に、静的にリンクされた DLL の DLL 検索パスを変更する方法

DLL がアプリケーション ディレクトリにない場合に、静的にリンクされた DLL の DLL 検索パスを変更する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 06:01:30670ブラウズ

How to Alter the DLL Search Path for Statically Linked DLLs When the DLL is Not in the Application Directory?

静的にリンクされた 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。