2013-03-10 71 views
1

我的問題是不導出函數,而是導入它。我確實知道函數和DLL都可以工作,因爲我使用了硬編碼的路徑來指向DLL。使用動態路徑指向DLL

這是目前工作:

function RoamingAppDataPath: String; external 'C:\Users\Peter\AppData\Roaming\ss\Application\ss.dll'; 

但是我需要指向同一個動態值的DLL所以我試圖做的是

  1. 聲明一個全局變量(的DLLPath:字符串)
  2. 分配的DLLPath值 - RoamingAppDataPath + '\ SS \應用程序\ ss.dll'

注意:RoamingAppDataPath是一個輸出漫遊應用程序數據文件夾路徑的函數。

我試圖運行的代碼是:

function RoamingAppDataPath: String; external DLLPath; 

當我編譯代碼,德爾福告訴我,這是需要一個常量表達式:

E2026 Constant expression expected 

什麼是圍繞工作爲了這?

+0

向我們展示您的'DLLPath'常量的真正定義。從[E2026錯誤描述](http://docwiki.embarcadero.com/RADStudio/XE3/en/E2026_Constant_expression_expected_(Delphi))中可以明顯地看出我之所以要求這樣做的原因。 – TLama 2013-03-10 12:07:11

+2

什麼是動態加載? btw:使用字符串作爲參數沒有sharemem將不是一個好主意。 – bummi 2013-03-10 12:07:34

+0

@TLama - 我實際上已將DLLPath聲明爲字符串變量 – ple103 2013-03-10 12:11:09

回答

4

你必須在運行時綁定,這意味着你需要使用的LoadLibrary和GetProcAddress:

var 
    lib: HMODULE; 
    RoamingAppDataPath: function: string; 

lib := LoadLibrary(dllfilename); 
if lib=0 then 
    RaiseLastOSError; 
Pointer(RoamingAppDataPath) := GetProcAddress(lib, 'RoamingAppDataPath'); 

然後你就可以把它叫做:

radp := RoamingAppDataPath; 

一些評論:

  • 我不知道你爲什麼寫這個函數時它存在於標準系統庫中。
  • 跨DLL邊界使用字符串可能會失敗。您需要使用ShareMem並確保所有代碼都使用相同的Delphi版本構建。最好在調用代碼中分配緩衝區。
+0

更好使用SafeLoadLibrary或LoadLibraryEx – 2013-03-10 14:33:05

+1

爲什麼這麼說? LoadLibrary適用於很多用途。 – 2013-03-10 15:16:34

+0

這是一個合適的答案,假設DLL可能在任何地方。 – 2013-03-10 18:21:19

2

即使您能夠使用變量,也無處可以將值設置爲DLLPATH,因爲如果不能使用靜態DLL,就不會使用初始化。 如果您想爲DLL定義路徑,您將不得不使用動態加載。

procedure Test;external 'Notexists.DLL'; 
var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
    test; 
end; 

initialization 
Showmessage('Hallo'); // will never be seen if test is used. 
+1

你可以使用['delayed'](http://docwiki.embarcadero.com/RADStudio/XE3/en/Libraries_and_Packages#Delayed_Loading)指令來加載一個庫當函數被調用時。儘管如您所說,這種情況是['dynamic loading']的一項任務(http://docwiki.embarcadero.com/RADStudio/XE3/en/Libraries_and_Packages#Dynamic_Loading_.28Windows-only.29)。 [+1] – TLama 2013-03-10 12:50:53