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 に伝える方法はありますか? 多分マニフェストか何か?これは、私が探している一種の「魔法の弾丸」です。自分ができるということがわかっている:
- おそらくインストーラーで、Windows パスを変更します。それは醜いです。
- DLL の 2 つ目のコピーを、不要なステップ子フォルダーに直接追加します。また醜い
- 適切な修正をコーディングしてテストする間、プロジェクトを遅らせます。受け入れられない。
- 他の?
特に「その他」について、ご指導いただきありがとうございます。この問題は必ずしも Delphi に固有のものではないことを理解しています。ありがとう!