兩個Delphi程序需要加載foo.dll,其中包含一些將客戶端身份驗證證書注入SOAP請求的代碼。 foo.dll駐留在c:\ fooapp \ foo.dll中,通常由c:\ fooapp \ foo.exe加載。這工作正常。其他程序需要相同的功能,但它駐留在c:\ program files \ unwantedstepchild \ sadapp.exe中。兩個AP加載DLL,此代碼:Delphi LoadLibrary無法找到DLL其他目錄 - 任何不錯的選擇?
FOOLib := LoadLibrary('foo.dll');
...
If FOOLib <> 0 then
begin
FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
FOOProc(myHttpRequest, Data, CertName);
end;
它foo.exe的偉大工程,爲DLL就在那裏。 sadapp.exe無法加載該庫,因此FOOLib爲0,其餘永遠不會被調用。因此,sadapp.exe程序默默無法注入證書,而當我們針對生產進行測試時,證書缺失,連接失敗。顯然,我們應該完全限定DLL的路徑。在沒有深入細節的情況下,測試方面直到最近才解決了這個問題,現在修復代碼基本爲時已晚,因爲這需要完整的迴歸測試,而且沒有時間。
由於我們自己畫到一個角落裏,我需要知道,如果有,我已經忽略了任何選項。儘管我們無法更改代碼(針對此版本),但我們可以調整安裝程序。我發現將c:\ fooapp放入路徑中工作。就像將foo.dll的第二個副本直接添加到c:\ program files \ unwantedstepchild中一樣。 c:\ fooapp \ foo.exe會一直運行,而sadapp.exe正在運行,所以我希望Windows可以找到它,但顯然不是。有沒有辦法告訴Windows,我真的想要同一個DLL?也許是一個清單或什麼?這是我期待的那種「神奇的子彈」。 我知道我可以:
- 修改Windows路徑,可能在安裝程序中。這很醜陋。
- 將DLL的第二個副本直接添加到unwantedstepchild文件夾中。也醜陋
- 延遲項目,同時我們編碼和測試一個適當的修復程序。不能接受的。
- 其他?
感謝您的任何指導,特別是與 「其他」。我明白這個問題並不一定是特定於德爾福的。謝謝!
1和2是我可以接受的。你說這只是爲了這個版本。所以把它看作是一個臨時的解決方案。你可以在下一個版本中做到這一點。在我看來,你不需要浪費你的時間。 2可能更好,因爲您可以毫無問題地卸載它。 – Runner 2010-03-30 12:49:46
你認爲你的選擇1和2是「醜陋的」。相反,這些都是股票標準技術,而且根本不難看。另一方面,你說「顯然,我們應該完全限定DLL的路徑」。 **絕對不是!**你在這裏建議的真***會是醜陋的***。不是每個人都熱衷於用你的'fooapp'文件夾污染他們的C:\文件夾結構。然而,通過硬編碼的方式,你不可能讓別人做任何事情。 _用戶應該能夠安裝到任何位置**或任何驅動器**並仍然有一個工作的應用程序。 – 2017-12-28 22:05:34
您有第4個選項:將DLL安裝到Windows路徑上的共享文件夾中。窗口「系統文件夾」是一個候選人(但你可以使用和配置自己的文件夾,如果你選擇)。共享文件夾確實有一個小問題:這意味着所有應用程序都使用DLL的_same版本。並可能導致一個稱爲「DLL地獄」的問題(建議閱讀)。這通常通過在應用程序文件夾中放置特定版本的DLL來解決(即您的選項2)。所以自然我會建議選項2可能是最好的臨時解決方案;因爲無論如何它都會出現。 – 2017-12-28 22:14:35