2

2 つの Delphi プログラムが foo.dll をロードする必要があります。これには、クライアント認証証明書を SOAP 要求に挿入するコードが含まれています。foo.dll は c:\fooapp\foo.dll にあり、通常は c:\fooapp\foo.exe によってロードされます。それはうまくいきます。他のプログラムは同じ機能を必要としますが、c:\program files\unwantedstepchild\sadapp.exe にあります。両方の AP が次のコードで DLL をロードします。

FOOLib := LoadLibrary('foo.dll'); 
...
If FOOLib <> 0 then 
begin
  FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
  FOOProc(myHttpRequest, Data, CertName);
end;

dllがすぐそこにあるので、foo.exeに最適です。sadapp.exe はライブラリの読み込みに失敗したため、FOOLib は 0 になり、残りは呼び出されません。したがって、sadapp.exe プログラムはサイレントに証明書の挿入に失敗し、本番環境に対してテストするときに、証明書が見つからない場合、接続に失敗します。明らかに、DLL へのパスを完全に修飾する必要があります。多くの詳細には触れませんが、最近までこの問題を覆い隠していたテストの側面がありました.コードで修正するには基本的に遅すぎます.完全な回帰テストが必要になり、その時間はありません.

窮地に立たされてしまったので、見落としているオプションがないかどうかを知る必要があります。(このリリースでは) コードを変更することはできませんが、インストーラーを微調整することはできます。c:\fooapp をパスに配置すると機能することがわかりました。foo.dll の 2 番目のコピーを c:\program files\unwantedstepchild に直接追加する場合と同様です。c:\fooapp\foo.exe は sadapp.exe が実行されている間は常に実行されているため、Windows がそのように検出することを期待していましたが、明らかに検出されませんでした。同じ DLL が本当に必要であることを Windows に伝える方法はありますか? 多分マニフェストか何か?これは、私が探している一種の「魔法の弾丸」です。自分ができるということがわかっている:

  1. おそらくインストーラーで、Windows パスを変更します。それは醜いです。
  2. DLL の 2 つ目のコピーを、不要なステップ子フォルダーに直接追加します。また醜い
  3. 適切な修正をコーディングしてテストする間、プロジェクトを遅らせます。受け入れられない。
  4. 他の?

特に「その他」について、ご指導いただきありがとうございます。この問題は必ずしも Delphi に固有のものではないことを理解しています。ありがとう!

4

3 に答える 3

9

LoadLibraryの MSDN ドキュメントには、Windows が DLL を検索する場所が正確に記載されています。DLL へのパスをハードコードするか、アプリと同じフォルダーに配置するか、LoadLibrary ドキュメントの既定の検索場所のいずれかに配置する必要があります。

于 2010-03-30T12:45:14.670 に答える
3

これは、尋ねられた質問の正確な解決策ではありませんが、この質問に出くわしたとき、私を助けてくれました:

LoadLibraryviaの検索パスを拡張できますSetDllDirectory

MSDN-Dokuから:

検索パスは、SetDllDirectory 関数を使用して変更できます。SetCurrentDirectory を使用したり、DLL へのフル パスをハードコーディングしたりする代わりに、このソリューションをお勧めします。

LoadLibrary呼び出しの前に 1 行追加する必要がありました。

SetDllDirectory(PChar('c:\fooapp'));
于 2017-12-28T18:09:16.210 に答える
0

または、単に環境変数「パス」を編集して、そこに dll へのパスを配置することもできます。この場合;c:\fooapp、パスに追加するだけで十分です。親の環境の変更は子に影響を与えるため、環境変数を調整してアプリケーションに生成するローダー アプリケーションを作成することもできます。

于 2010-03-30T18:02:03.150 に答える