2010-10-28 298 views
6

我想,以防止惡意的DLL是可能加載通過當前工作目錄的訪問權限,如http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx如何在Delphi中調用WinAPI函數SetDllDirectory()?

在我們的C++應用程序實現的解決方案是讓一個WinAPI的調用SetDllDirectory會(「」)中所述,這將有效地從Windows DLL加載搜索路徑中刪除當前工作目錄。但是,似乎這個解決方案不適用於我們的Delphi應用程序,因爲SetDllDirectory()函數不存在。

在Delphi中是否存在與SetDllDirectory(「」)完全相同的調用?謝謝!

+1

如果您想在Windows API中使用Windows API中的函數(即Windows **中的函數**,它看起來與任何語言相同),但它通常不是在Windows.pas中聲明的容易自己申報。所有你需要的是在MSDN上的信息,其中指定了參數和結果的數據類型,以及查找的DLL。在大多數情況下,甚至在Delphi中也可以使用那些類型(比如HBRUSH ,HWND等),或者您可以使用等效類型(如'cardinal'或'THWND')。只要不要忘記將調用約定設置爲'stdcall'。 – 2010-10-28 21:58:48

回答

4

調用SetDllDirectory('')不起作用?我發現它在最新版本的Windows.pas中正確聲明。如果你有一個未聲明的Delphi版本,你可以升級到最新版本的Delphi,或者自己聲明。

更新:然後你去... Jens剛剛發佈了聲明。

6

這應該做的伎倆:

function SetDllDirectory(lpPathName:PWideChar): Bool; stdcall; external 'kernel32.dll' name 'SetDllDirectoryW'; 
+0

請記住,您是靜態鏈接到該功能,所以應用程序將至少需要XP SP1才能運行。如果您需要運行舊版本,則需要通過GetProcAddress()動態加載該函數。 – 2010-10-29 01:13:40

+0

在預編碼的Delphi版本函數SetDllDirectory(lpPathName:PAnsiChar)中:Bool; STDCALL;外部'kernel32.dll'名'SetDllDirectoryA';也可以使用。 – 2010-10-29 07:38:40

+0

@Remy:技術上是正確的,但如果他們之前在C++應用程序中使用了SetDllDirectory,我想這不會是一個問題。 – 2010-10-29 08:26:27

3
uses DSiWin32; 

if not DSiSetDllDirectory('path') then 
    .... 

DSiSetDllDirectory也會照顧動態鏈接,並會優雅地失敗的預XP SP1系統。

DSiWin32作爲免費軟件發佈。