4

dll (プロジェクトにはない) を使用するネイティブ VC++ プロジェクトがあります。ここで、DLL を「Windows が DLL を見つけるために使用する検索パス」 リンクの 1 つに配置する必要があります。

しかし、dllを実行可能ファイル、現在のウィンドウ、またはシステムディレクトリに配置したくありません。

したがって、それによる私の唯一のオプションは、パスを %PATH% 環境変数に追加することです。

他に方法はありますか?

そうするエレガントな方法はありますか(PATHに追加する)?インストール時にこれを行う必要がありますか?私がこれをしている場合、私は心配する必要がありますか?

4

8 に答える 8

5

私が見つけたすべてのテクニックを要約します。

  • マネージ プロジェクトをスタートアップ プロジェクトとして使用する場合 (実際には私の場合)、Enviroment クラスを使用します。

文字列 temp = "myFullDirectoryPathToDll"; 文字列 temp2 =Environment.GetEnvironmentVariable("PATH") + ";" +温度; Environment.SetEnvironmentVariable("パス", temp2);

これは、MSDN が強調すべきだったと思いますが、このプロセスでのみ環境変数 PATH を変更します。

VS でデバッグする場合、appPath は「機能」しません プロパティ -> デバッグ -> 環境を使用し、環境変数をマージします リンク

于 2008-10-23T15:37:29.240 に答える
4

以下にいくつかの提案を示します。

  • dll をリソースとしてメインの実行可能ファイルに埋め込み、それを一時ディレクトリに抽出して LoadLibrary を使用してロードし、GetProcAddress を使用して関連する関数アドレスを取得できます。

  • SetDllDirectory()を使用してメイン プロセスの検索パスを変更し、DLL の場所を含めることができます。これにより、システムにグローバルな変更を加える必要がなくなります。また、LoadLibrary/GetProcAddress を使用して関数のアドレスを解決します。

于 2008-10-23T13:27:37.347 に答える
1

DLL が配置されている可能性が高い場所がわかっている場合は、LoadLibrary() を使用して実行時にロードし、GetProcAddress() を使用して、呼び出す必要のある関数にバインドすることができます。

于 2008-10-23T13:17:59.303 に答える
1

インストールされたアプリケーションが私のグローバル PATH にランダムなものを追加したとしたら、私は嬉しくありません。これはすべてのアプリケーションに影響を与え、厄介な副作用をもたらす可能性があるためです。

私が見たのは、スタータースクリプトを持っていることです。
スクリプトは、ユーザーにとってはアプリケーションのように見え、機能します (したがって、それでもダブル クロックになります)。しかし、スクリプトは適切なパスを設定してから、実際のアプリケーションを起動します。

于 2008-10-23T13:19:30.203 に答える
1

DelayLoad を使用する場合は、dll をロードする関数を呼び出す前に、LoadLibrary を呼び出します。これにより、アプリケーションが「プライミング」され、検索されなくなります。GetProcAddress は不要

于 2008-10-23T17:37:56.360 に答える
0

システムレジストリにアプリケーションパスを設定してみました。ユーザーがregeditにアクセスする権限を持っている場合にのみ正常に機能します。また、環境変数PATHを変更します。テストユーザーには、変数を変更するための管理者権限がありません。

于 2009-01-15T22:01:34.317 に答える
0

遅延読み込みメソッドは、 を呼び出すと決定した時点で作業ディレクトリに対して機能しますLoadLibrary。これを有利に利用することができます。検索パスの順序の詳細については、http://msdn.microsoft.com/en-us/library/ms682586 (VS.85).aspx を参照してください。

于 2008-10-23T19:43:04.453 に答える
0

Windows のショートカットから起動する場合は、DLL のパスを [開始] の場所に指定し、.exe の完全な名前とパスを [ターゲット] の場所に指定することができます。

必要な DLL が .exe のディレクトリにある場合、Windows の DLL の検索順序は .exe のパスが最初に検索されるため (現在のディレクトリはリストの 5 番目)、Windows もそれらを見つけることができるはずです。

LoadLibrary/GetProcAddress メソッドを何度も使用しましたが、少し余分な作業 (多くの typedef と typecast) が必要になるため、できるだけ避けようとしています。

于 2008-10-23T19:35:45.700 に答える