2013-07-29 39 views
8

http://msdn.microsoft.com/en-us/library/9h658af8.aspx__declspec (dllimport) làm thế nào để tải thư viện

MSDN nói rằng tôi có thể xuất khẩu chức năng từ thư viện với __declspec(dllexport) nhưng làm thế nào tôi có thể tải thư viện này trong thực thi của tôi không?

Tôi đã có một chức năng xuất khẩu trong DLL:

__declspec(dllexport) void myfunc(){} 

Và bây giờ tôi muốn sử dụng nó trong thực thi của tôi:

__declspec(dllimport) void myfunc(void); 

Nhưng làm thế nào chương trình của tôi sẽ biết được nơi để tìm thấy điều này chức năng?

+4

Có một cái nhìn tại địa chỉ: http://stackoverflow.com/questions/538134/exporting-functions-from-a-dll-with-dllexport –

+3

Nó không phải là lên đến chương trình của bạn. Đó là vào hệ điều hành để tìm DLL mà bạn cần. Bạn có thể cho nó một thời gian rất khó khăn để làm như vậy nhưng không có chỉ để làm điều đó. Hãy chắc chắn rằng DLL có mặt trong cùng thư mục với EXE của bạn và nó sẽ hoạt động bơi lội. –

Trả lời

7

Đây là công việc biên dịch/mối liên kết, nó được thực hiện tự động miễn là bạn

  1. bao gồm các lib trong các tùy chọn Linker
  2. cung cấp các DLL khi chạy để nó được tìm thấy bởi các exe

Tệp .lib được tạo khi bạn biên dịch tệp DLL hoặc được gửi cùng với nó nếu đó không phải là mã của bạn. Trong trường hợp này, mã được biên dịch với __declspec(dllexport).

Khi biên dịch exe của bạn, trình biên dịch thấy rằng hàm được bao gồm được tìm thấy trong DLL. Trong trường hợp này, mã được biên dịch với __declspec(dllimpport).

Trình liên kết được cung cấp với tệp .lib và tạo hướng dẫn thích hợp trong exe.

Các hướng dẫn này sẽ làm cho Exe tìm DLL và tải hàm đã xuất tại thời gian chạy. DLL chỉ cần được bên cạnh các exe (có những nơi khác có thể, tuy nhiên).

Chuyển đổi giữa __declspec(dllimpport)__declspec(dllexport) được thực hiện bằng macro, provided by Visual C++ when creating a DLL project.

+0

Làm cách nào để cung cấp DLL trong thời gian chạy? – deepspace

+0

@deepspace xem chỉnh sửa của tôi, nó chỉ cần được bên cạnh Exe – CharlesB

1

Hệ điều hành của bạn sẽ có thể tìm thấy nó dựa trên quá trình liên kết. Nếu thư viện của bạn được liên kết đúng với chương trình của bạn, nó sẽ nhận ra rằng có một chức năng bên ngoài đang được sử dụng, và tìm nó trong các đường dẫn dll. Nếu nó không thể tìm thấy nó, mối liên kết của bạn sẽ ném một lỗi.

Tôi khuyên bạn nên thực hiện một số đọc vào quá trình liên kết; nó có thể gây nhầm lẫn vào những thời điểm nhưng sự hiểu biết nó có thể giúp bạn nắm bắt một số khái niệm chính trong C/C++.

1

Nếu bạn đang sử dụng DLL, bạn có thể sử dụng kết hợp LoadLibraryGetProcAddress.

//Load the DLL 
HMODULE lib = LoadLibrary("testing.dll"); 

//Create the function 
typedef void (*FNPTR)(); 
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc"); 

//EDIT: For additional safety, check to see if it loaded 
if (!myfunc) { 
    //ERROR. Handle it. 
} 

//Call it! 
myfunc(); 
+0

là một thay thế cho __declspec (dllimpport)? – pasha

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