2010-09-29 27 views
12

Có cách nào để tải động và gọi các hàm từ các DLL động trong D? Tôi muốn chương trình của tôi có thể tải các trình bổ sung khi khởi động và có lẽ cả khi đang chạy.Đang tải Plugins (DLL) on-the-fly

+0

Có. Đây là một tài liệu tham khảo nhanh: http://www.digitalmars.com/d/2.0/dll.html –

+0

Đó là những gì tôi đã sợ ... về cơ bản chúng tôi đang mắc kẹt với việc sử dụng phương pháp C của việc lấy địa chỉ proc và đi từ đó. Không khủng khiếp, tôi giả định, vì tôi có thể bọc tất cả các đối tượng plugin của mình thành một "nhà máy chính", nhưng không tối ưu. –

Trả lời

9

Tùy thuộc vào mức độ động mà bạn muốn nhận. Nếu bạn muốn tự động tải một dll và chạy một số chức năng được xác định trước, có một wrapper rất đẹp bởi Wei Li here. Nhờ sức mạnh của mẫu, nó cho phép bạn làm những việc như sau:

// define functions 
alias Symbol!("MessageBoxW", int function(HWND, LPCWSTR, LPCWSTR, UINT)) mbw; 
alias Symbol!("MessageBoxA", int function(HWND, LPCSTR, LPCSTR, UINT)) mba; 
// load dll 
auto dll = new Module!("User32.dll", mbw, mba); 
// call functions 
dll.MessageBoxW(null, "Hello! DLL! ", "Hello from MessageBoxW", MB_OK); 
dll.MessageBoxA(null, "Hello! DLL! ", "Hello from MessageBoxA", MB_OK); 

Mã này là D1. Đối với D2, bạn phải thay thế char[] bằng string, sử dụng toStringz() và có thể xóa scope. Chỉnh sửa:my D2 port của mã này có thể hữu ích cho những người khác tìm câu hỏi này.

+0

Tôi ước mình có thêm 1 điểm +1. Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn! –

+1

@Timothy: Rất vui được. Đối với tôi, mã là một ví dụ tốt về số lượng bạn có thể đạt được với một vài dòng mã sử dụng các mẫu và các mixin. Nó gần như cảm thấy như Python. – stephan

+0

Tôi nhận ra đây là một vài tháng tuổi, nhưng cảm ơn một tấn cho bản cập nhật D 2.0! Tôi cũng ước rằng tôi có nhiều upvotes hơn để phát! –