2010-10-28 40 views
6

Tôi muốn ngăn chặn tải DLL độc hại mà có thể có thể thông qua truy cập của thư mục làm việc hiện tại như mô tả trong http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspxLàm thế nào để gọi hàm WinAPI SetDllDirectory() trong Delphi?

Các giải pháp thực hiện trong các ứng dụng của chúng tôi C++ là để thực hiện cuộc gọi WinAPI để SetDllDirectory (""), mà có hiệu quả sẽ loại bỏ các thư mục làm việc hiện tại từ đường dẫn tìm kiếm tải Windows DLL. Tuy nhiên, có vẻ như giải pháp này không có sẵn cho các ứng dụng Delphi của chúng tôi vì hàm SetDllDirectory() không tồn tại.

Có cuộc gọi tương đương trong Delphi thực hiện điều tương tự như SetDllDirectory ("") không? Cảm ơn!

+1

Nếu bạn muốn sử dụng một chức năng trong Windows API (có nghĩa là, một hàm ** trong Windows **, trông giống nhau trong bất kỳ ngôn ngữ nào) không được khai báo trong 'Windows.pas', thường thì thực sự dễ dàng tự khai báo. Tất cả những gì bạn cần là thông tin tại MSDN, nơi mà các kiểu dữ liệu của đối số và kết quả được chỉ định, như là DLL để xem xét. Trong hầu hết các trường hợp, các kiểu được sử dụng có thể được sử dụng ngay cả trong Delphi (như HBRUSH) , HWND, vv), hoặc bạn có thể sử dụng một loại tương đương (chẳng hạn như 'cardinal', hoặc' THWND'). Chỉ cần đừng quên đặt quy ước gọi thành 'stdcall'. –

Trả lời

4

Gọi SetDllDirectory ('') không hoạt động? Tôi thấy rằng nó được khai báo đúng trong các phiên bản mới nhất của Windows.pas. Nếu bạn có một phiên bản của Delphi mà nó không được khai báo, bạn có thể nâng cấp lên phiên bản Delphi mới nhất hoặc tự khai báo nó.

Cập nhật: Và ở đó bạn ... Jens vừa đăng tuyên bố.

6

này nên làm như lừa:

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

Hãy nhớ rằng bạn đang liên kết tĩnh với hàm, do đó ứng dụng sẽ yêu cầu ít nhất XP SP1 để chạy. Nếu bạn cần chạy trên các phiên bản cũ hơn, thì bạn cần phải tự động nạp hàm qua GetProcAddress(). –

+0

Trong một chức năng phiên bản trước Unicode Unicode SetDllDirectory (lpPathName: PAnsiChar): Bool; stdcall; tên 'kernel32.dll' bên ngoài 'SetDllDirectoryA'; cũng có thể được sử dụng. –

+0

@Remy: Về mặt kỹ thuật đúng, nhưng nếu họ sử dụng SetDllDirectory trong các ứng dụng C++ của họ trước đây, tôi đoán đó sẽ không phải là một vấn đề. –

3
uses DSiWin32; 

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

DSiSetDllDirectory cũng sẽ chăm sóc liên kết động và sẽ thất bại một cách duyên dáng trên các hệ thống SP1 trước XP.

DSiWin32 được phát hành dưới dạng phần mềm miễn phí.

Các vấn đề liên quan