2013-02-22 22 views
5

Tôi có một DLL mở rộng MFC xuất ra lớp C++ và tôi cần phải sửa đổi hành vi của một phương thức lớp. Những thay đổi không ảnh hưởng đến chữ ký của các phương thức của lớp.Biên dịch lại MFC Extension DLL thay đổi các điểm nhập của các hàm đã xuất

Tôi không muốn biên dịch lại các mô-đun đã sử dụng tệp "lib" của phiên bản được phát hành trước đó của thư viện này.

Điều gì sẽ xảy ra nếu thay đổi sửa đổi địa chỉ của điểm nhập của các chức năng?

Ví dụ, địa chỉ của các nhà xây dựng đã thay đổi:

Export Ordinal  Function Hint      Entry Point 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009CB0 (OLD DLL) 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009760 (NEW DLL) 

Tôi có nên biên dịch các module có sử dụng thư viện không?

Tôi đã thử nghiệm thư viện được biên dịch lại - với các điểm nhập mới - sử dụng các tệp thi hành được phát hành và mọi thứ hoạt động tốt. Tôi không chắc chắn rằng kịch bản này đang ẩn một số tác dụng phụ.

Khi nào cần biên dịch lại tệp thực thi liên kết đến DLL?

Khi nào khả năng tương thích nhị phân bị hỏng?

Trả lời

2

Đây là một trong những lợi ích của việc sử dụng một DLL - bạn có thể thay đổi nó, và miễn là bạn tiếp tục giữ cùng chữ ký chức năng mọi thứ sẽ hoạt động tốt. Liên kết xảy ra khi chương trình được tải, do đó, thay đổi địa chỉ không tạo ra bất kỳ sự khác biệt nào.

Bạn sẽ muốn hoàn toàn tích cực rằng mọi lớp được định nghĩa trong DLL không có bất kỳ phương thức nội tuyến nào, vì những phương thức này có thể không hoạt động với bất kỳ thay đổi nội bộ nào đối tượng.

Khả năng tương thích nhị phân bị hỏng khi chữ ký chức năng thay đổi hoặc khi biến thành viên công khai thay đổi vị trí trong đối tượng. Tôi sẽ tránh các biến thành viên công khai trong một DLL hoàn toàn.

Chỉnh sửa: như đã nêu trong nhận xét, bạn cũng có thể gặp rắc rối nếu các biến được thêm vào hoặc bị xóa khỏi lớp, thay đổi kích thước của nó. Điều này trở thành một vấn đề nếu các đối tượng được tạo ra bên ngoài của DLL, hoặc là các biến cục bộ hoặc thông qua new. Bạn có thể tránh điều này bằng cách tạo tất cả các cá thể đối tượng của bạn từ bên trong DLL và truyền con trỏ tới người gọi. Bạn cũng có thể tránh các sự cố bằng cách sử dụng PIMPL idiom trên lớp học của mình.

+0

Vì dường như anh đang sử dụng các lớp, một thể hiện khác có thể gây ra vỡ tinh tế, ngoài nhận xét của bạn về vị trí, là các biến thành viên mới được thêm vào bên trong một lớp nằm trong DLL. –

+0

@NikBougalis, cảm ơn lời nhắc - tôi đã thêm vào câu trả lời của mình để đề cập đến tình huống đó. –

+0

Cảm ơn tất cả vì sự giúp đỡ của bạn. – sam

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