2010-02-20 31 views
6
#ifndef _DLL_TUTORIAL_H_ 
#define _DLL_TUTORIAL_H_ 
#include <iostream> 

#if defined DLL_EXPORT 
#define DECLDIR __declspec(dllexport) 
#else 
#define DECLDIR __declspec(dllimport) 
#endif 

extern "C" 
{ 
    DECLDIR int Add(int a, int b); 
    DECLDIR void Function(void); 
} 

#endif 

Mã số DECLDIR __declspec(dllexport) thực sự làm gì?Mã "DECLDIR __declspec (dllexport)" thực sự là gì?

+1

@deepak: Chào mừng bạn đến với 'StackOverflow'! Tôi đã định dạng mã của bạn (chọn nó và nhấn Ctrl + K). –

Trả lời

1

Định nghĩa hằng số macro DECLDIR__declspec(dllexport). dllexport là để xuất các hàm từ các tệp DLL. Dưới đây là một trích dẫn từ this page:

Những thuộc tính này xác định một cách rõ ràng giao diện DLL để khách hàng của mình, mà có thể là tập tin thực thi này hay cách khác DLL. Khai báo chức năng như dllexport loại bỏ sự cần thiết cho tệp định nghĩa mô-đun (.DEF), tại ít nhất đối với đặc điểm của các hàm đã xuất. Lưu ý rằng dllexport thay thế từ khóa __export.

Nếu một lớp được đánh dấu declspec (dllexport), bất kỳ chuyên ngành của lớp mẫu trong hệ thống phân cấp lớp đang ngầm đánh dấu là declspec (dllexport). Điều này có nghĩa là các mẫu được rõ ràng là được khởi tạo và các thành viên của mẫu phải được xác định là .

__declspec, nhân tiện, là explained here.

8

Trong thế giới Microsoft, __declspec(dllexport) làm cho một hàm hoặc lớp có thể gọi từ bên ngoài DLL.

Khi bạn tạo DLL, theo mặc định, bất kỳ hàm nào được xác định trong DLL chỉ có thể gọi từ cùng một DLL đó. Bạn không thể gọi hàm đó từ một tệp thực thi hoặc một DLL khác.

Nếu bạn muốn hàm của mình được gọi từ bên ngoài DLL, bạn cần xuất hàm bằng cách thêm __declspec(dllexport).

Một cách để suy nghĩ về điều này là __declspec(dllexport) đánh dấu một chức năng như là một phần của giao diện công khai của DLL.

Trong khi bạn không hỏi về __declspec(dllimport) thì điều ngược lại. Khi gọi một hàm trong một DLL khác, DLL của bạn cần biết rằng nó là một phần của giao diện public DLL khác nhau để nó có thể xử lý đúng cuộc gọi (gọi hàm trong một DLL khác yêu cầu mã phức tạp hơn để gọi một hàm trong chính bạn).

+0

Điều này rõ ràng hơn rất nhiều. – thezhaba

+0

Cảm ơn bạn đã giải thích tốt đẹp và dễ dàng – spt025

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