Đây là lần đầu tiên tôi xử lý các tệp DLL. Sau khi tài liệu MSDN Tôi tạo ra một tập tin header fooExports.h với các macro được xác định theo một định nghĩa preprocessor:Làm cách nào để xuất/nhập cấu trúc C từ DLL/ứng dụng bảng điều khiển bằng cách sử dụng __declspec (dllexport/import)
#ifdef FOODLL_EXPORTS
#define FOO_API __declspec(dllexport)
#else
#define FOO_API __declspec(dllimport)
Ý định của tôi là sử dụng tiêu đề này cả trong việc thực hiện DLL của tôi cũng như trong việc áp dụng giao diện điều khiển. Cho đến nay chức năng nhập và xuất hoạt động tốt. Vấn đề đặt ra khi tôi cố gắng xuất một cấu trúc đã định nghĩa mà tôi cần làm tham số cho một trong các hàm được xuất. Ví dụ, trong file header nói trên Tôi tuyên bố FOO_API void foo(FooParams *args)
và args
là một cấu trúc được định nghĩa như sau:
typedef struct FooParams
{
char *a;
char *b;
void *whatever; //some other type
} FooParams;
struct này phải được quy định tại foo.h hơn là trong fooExports.h. Có cách nào để xuất cấu trúc này mà không lấy nó ra khỏi tệp tiêu đề gốc của nó (xem xét rằng tôi muốn giữ cho xuất/nhập tập trung trong fooExports.h). Cách tiếp cận tốt hơn để làm điều này là gì? DLL là tất cả C cũng như ứng dụng khách sử dụng nó.
Bạn không xuất các loại, bạn xuất các ký hiệu liên kết. – aschepler
@aschepler bạn có muốn mở rộng không? – wotann07
Nó không phải là tất cả rõ ràng lý do tại sao bạn sử dụng hai tập tin .h hoặc lý do tại sao bạn chỉ cần không khai báo các loại đối số cho foo(). Không có gì để xuất trong cấu trúc, nó không có bất kỳ mã nào. Cách đơn giản để tránh tình trạng tiến thoái lưỡng nan là chỉ sử dụng một tệp .h và được thực hiện với nó. –