17

openssl dll(libeay32.dllおよびssleay32.dll)を使用するアプリケーションを作成しました。それらを使用するのはインディです。dllを直接呼び出すことはありません。

インストーラーを回避するために私が見つけた最も簡単な回避策(私はexeファイルを削除するだけで、このアプローチで大丈夫です)は次のとおりです。

  1. 実行ファイルのリソースとしてdllを配置します
  2. プログラムの開始時に、exeフォルダにそれらを抽出します
  3. exeはそれらを使用します

これは完璧ですが、exeフォルダー(多くの場合デスクトップ)ではなくtempフォルダーにdllを抽出することで、アプローチを改善したいと思います。

問題は、アプリケーションにtempフォルダー内のdllを強制的に使用させる方法がわからないことです。これは、現在の動作が次のとおりであるためです。dllが現在のディレクトリにない場合は、システムパスで定義されたディレクトリを検索してみてください。

インディに私の一時パスでdllを使用させるための解決策を誰が知っていますか?(「一時的にdllを登録する」など)

4

3 に答える 3

21

最新バージョンのIndy10を使用している場合、ユニットには、OpenSSLDLLを検索するカスタムフォルダーをIndyに通知IdSSLOpenSSLHeadersするパブリック関数があります。IdOpenSSLSetLibPath()

procedure IdOpenSSLSetLibPath(const APath: String);
于 2012-11-07T19:38:14.147 に答える
16

LoadLibrary一時フォルダにDLLを書き込んだらすぐに、自分でDLLをロードします。
これにより、IndyLoadLibraryは必要なときにDLLを使用できるようになります。

lpFileNameにパスが含まれておらず、同じベース名と拡張子を持つロードされたモジュールが複数ある場合、関数は最初にロードされたモジュールへのハンドルを返します。

于 2012-11-07T12:46:22.390 に答える
10

SetDllDirectoryDLLの検索順序を操作するために使用できます。

于 2012-11-07T12:36:17.153 に答える