Khi xây dựng COM DLL, tại sao nên kim ngạch xuất khẩu như DllGetClassObject
, DllCanUnloadNow
, DllRegisterServer
, DllUnregisterServer
vv được đánh dấu PRIVATE
trong phần EXPORTS
của liên .DEF
tập tin?Tại sao xuất khẩu COM DLL nên được đánh dấu "TƯ NHÂN"?
Trả lời
Khi bạn tạo DLL, trình liên kết sẽ tự động tạo một thư viện nhập cho DLL. Nó chứa danh sách tất cả các hàm được xuất. Bạn sử dụng thư viện nhập khẩu đó trong một dự án khác sử dụng DLL.
Cụ thể đối với các máy chủ COM là 4 chức năng được xuất luôn được tìm thấy với GetProcAddress() và bạn không bao giờ có sự phụ thuộc ngầm trên một dll COM. Bạn luôn tạo các đối tượng COM với CoCreateInstance(), hệ thống ống nước COM sẽ quan tâm đến việc định vị tệp DLL và sử dụng hàm GetProcAddress() để tìm hàm DllGetClassObject(). Cùng một câu chuyện cho DllUn/RegisterServer, được tìm thấy bởi Regsvr32.exe. Và DllCanUnloadNow, được tìm thấy bởi hệ thống ống nước COM. Do đó bạn không cần thư viện nhập khẩu.
Sử dụng RIÊNG đảm bảo rằng hàm không được xuất sang thư viện nhập. Với tất cả chúng riêng tư, bạn hoàn toàn không nhận được thư viện nhập. Không có gì sai nếu bạn bỏ qua nó, bạn chỉ nhận được một tập tin bổ sung từ linker mà bạn sẽ không bao giờ sử dụng.