2014-11-14 111 views
-2

所以,我想從Delphi XE2中的一個DLL中調用一個過程。 但程序不會分配。在Delphi XE2中調用dll的過程

我嘗試了幾個在互聯網上找到的例子。 正在按預期加載DLL。 輸出正確寫入。

一切似乎都很好,但仍然沒有成功。

這是怎麼回事?

我的代碼如下

type 
    TStarter = procedure; stdcall; 

... 

fTheHookStart: TStarter; 

... 

procedure TForm1.LoadHookDLL; 
begin 
    LogLn('Keyboard Hook: Loading...'); 
    // Load the library 
    DLLHandle := LoadLibrary('thehookdll.DLL'); 

    // If succesful ... 
    if Handle <> 0 then 
    begin 
    LogLn('Keyboard Hook: DLL load OK!'); 
    LogLn('Keyboard Hook: assigning procedure ...'); 

    fTheHookStart := TStarter(GetProcAddress(DLLHandle, 'StartTheHook')); 
    if @fTheHookStart <> nil then 
    begin 
     LogLn('Keyboard Hook: procedure assignment OK!'); 
     LogLn('Keyboard Hook: Starting...'); 
     fTheHookStart; 
    end 
    else 
    begin 
     LogLn('Keyboard Hook: procedure assignment FAIL!'); 
     FreeLibrary(DLLHandle); 
     if Handle <> 0 then LogLn('Keyboard Hook: DLL free OK!') else LogLn('Keyboard Hook: DLL free FAIL!'); 
    end; 
    end 
    else 
    begin 
    LogLn('Keyboard Hook: DLL load FAIL!'); 
    end; 
end; 
+3

假設您發佈的代碼正是您正在測試的內容...您設置了DLLHandle,然後測試了「Handle <> 0」...可能是您的DLL本身無法加載。 – 2014-11-14 20:13:36

+0

oooohhh現在我明白了。我甚至沒有注意到這一點。 – xaid 2014-11-14 22:02:58

回答

6

一個錯誤是分配DllHandle當你加載DLL,但你是否手柄 <>爲零。句柄實際上是你的表格句柄,當然不是零。如果加載成功,則無關緊要,但如果失敗,則會導致錯誤的日誌記錄。 由於您也有一些日誌記錄功能,日誌顯示了什麼?

+0

Aaaaah我現在看到。謝謝我沒有注意到這一點。 – xaid 2014-11-14 22:03:29

3

據我瞭解,該DLL加載,但GetProcAddress回報nil。只有一種這樣的故障模式。該DLL不會導出具有該名稱的函數。

小心名字裝飾和信箱。 C和C++ DLL可能會導出裝飾名稱。導出的名字對字母大小寫敏感。

使用dumpbin或Dependency Walker檢查導出的函數名稱。

僅供參考,如GetProcAddress發生故障,如文檔說明,致電GetLastError將產生錯誤代碼。


它看起來像其他答案是東西。你相信你已經正確地加載了DLL,但是你的代碼沒有正確地執行這個檢查。

如果您叫過GetLastError,那麼系統已經警惕過您。如果您在調試器下檢查了這些變量,問題就會很明顯。

+0

但是如何使用dumpbin?我從來沒有聽說過它 – xaid 2014-11-14 18:54:43

+0

這是MS工具之一。依賴Walker更容易使用。 – 2014-11-14 19:00:22

+0

@MartynA名稱是一個名稱。如果'tdump'獲得導出名稱,那很好。我只是碰巧使用其他工具。取決於具有一些令人欣慰的GUI。 – 2014-11-14 19:10:01