Làm thế nào để tạo một số lớp từ dll (constructor in dll)? (С ++) hoặc cách tự động tải lớp từ dll?Làm thế nào để tạo một số lớp từ dll (constructor in dll)? (С ++)
Trả lời
Trả lời câu hỏi của bạn đúng, bạn cần phải thêm một extern "C" hàm trả về kết quả của các nhà xây dựng:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
Sau đó, trong nguồn của bạn, bạn có thể sử dụng GetProcAddr vào "new_foo" để gọi hàm .
Bạn sẽ cần xuất một hàm từ DLL gọi đến hàm khởi tạo và trả về đối tượng mới.
Cố gắng tránh sử dụng các loại C++ cụ thể làm thông số chức năng; ý tưởng của các tệp DLL là bạn có thể cập nhật chúng một cách độc lập, nhưng trình biên dịch được nâng cấp có thể đặt ra std :: string khác nhau, gây ra sự không tương thích khi chạy.
Đây là nội dung gốc của COM, ví dụ - hệ thống loại giới hạn và chức năng được xuất chuẩn để nhận các phiên bản của đối tượng.
Tt âm thanh như thể nguồn DLL không nằm trong tầm kiểm soát của anh ta. –
Nguồn DLL nằm dưới sự kiểm soát của tôi – SomeUser
Nếu lớp được dự định sẽ được sử dụng, thì có lẽ nó đã được biên dịch với __declspec (dllexport), do đó, nó chỉ là vấn đề thuyết phục tệp tiêu đề để đặt __declspec (dllimport) trong định nghĩa lớp. Nếu không, bạn luôn có thể tự sửa đổi tập tin tiêu đề. – JesperE
Bạn cần khai báo lớp học của mình bằng cách sử dụng từ khóa __declspec(dllexport)
khi tạo DLL. Khi sử dụng các DLL, lớp cần phải được khai báo với __declspec(dllimport)
:
#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif
class DECLSPEC_CLASS MyClass
{
...
}
Khi DLL được biên dịch, bạn nên thêm -DCOMPILING_DLL vào danh sách các định nghĩa.
Khi sử dụng lớp, bạn phải liên kết tĩnh với DLL, tức là chuyển thư viện nhập mydll.lib vào chương trình chính.
Nếu bạn muốn tải DLL khi chạy, bạn cần có hàm C trong DLL tạo đối tượng và trả về cho bạn. Không có cách nào để tra cứu một constructor động trong một DLL (sử dụng GetProcAddress()).
Thay vì xuất khẩu tất cả các phương thức của lớp sử dụng __declspec, bạn cũng có thể dựa trên thực tế là trình biên dịch có thể gọi chức năng ảo qua vtable, vì vậy ví dụ:
//note: no __declspec
class IPublicInterface
{
virtual ~IPublicInterface() = 0;
virtual void SomeMethod() = 0;
};
//note: no __declspec
class SomeClass : IPublicInterface
{
virtual ~SomeClass() { ... }
virtual void SomeMethod() { ... }
};
//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
return new SomeClass();
}
/nhà máy rất đẹp, đặc biệt nếu bạn định sử dụng 'GetProcAddress' và bảng được xuất thủ công .def xuất khẩu –
Vì bộ nhớ được cấp phát trong DLL, có lẽ cũng nên có' freeSomClass (IPublicInterface *) ' đảm bảo bộ nhớ được giải phóng chính xác? – Robert
Tôi nghĩ câu trả lời này là sai và nên bị xóa. Bạn không thể chuyển đối tượng đa hình qua ranh giới của plugin, ngoại trừ khi trình biên dịch chính xác được sử dụng trong cả plugin và ứng dụng. –
- 1. Làm thế nào để sử dụng một lớp trong DLL?
- 2. Làm thế nào để tạo một dll như shell32.dll có chứa các biểu tượng
- 3. Tạo một DLL từ MATLAB
- 4. Làm thế nào để bạn trích xuất mã nguồn của lớp học từ một tệp dll?
- 5. truy cập .net2.0 dll in a .net 4.0 dll
- 6. .NET - Làm thế nào để gỡ lỗi một DLL?
- 7. py2exe để tạo dll?
- 8. Làm thế nào để tìm một DLL cho một CLSID?
- 9. Làm thế nào để liên kết một .DLL tĩnh?
- 10. cách truy cập một lớp từ một dll trong python?
- 11. Tham khảo một DLL từ một DLL khác
- 12. Làm thế nào để bảo vệ dll?
- 13. C++ Giao diện plugin DLL
- 14. Lấy tên của một DLL từ bên trong dll
- 15. Làm thế nào để bạn tạo một DLL COM trong Visual Studio 2008?
- 16. Làm thế nào để tải một dll C# trong python?
- 17. cắt một lớp xử lý DLL
- 18. In tin nhắn tới bàn điều khiển từ C++ DLL
- 19. Tạo một DLL từ một tệp cpp bọc với SWIG
- 20. Làm thế nào để sử dụng các lớp C++ được xuất bởi một dll ở Delphi
- 21. Làm thế nào để dịch ngược một tệp .dll được tạo trong VS.net
- 22. Làm thế nào để WinSxS phân giải các tên DLL thành các vị trí DLL?
- 23. Làm thế nào để gọi một DLL .NET từ một tiến trình Win32?
- 24. Làm thế nào để tạo dll trong MATLAB và sử dụng các dll này trong các ứng dụng .Net
- 25. Làm thế nào để P/Gọi một dll bản xứ từ Metro?
- 26. Làm cách nào để tạo một .dll được tạo bằng IKVM com?
- 27. Làm thế nào để tạo một tệp JAR bao gồm các tệp DLL?
- 28. Làm thế nào để sử dụng C# dll trong vC++?
- 29. Tạo .dll bằng CMake
- 30. Làm cách nào để gọi hàm Windows DLL từ Ruby?
bạn có một tập tin tiêu đề phù hợp và/hoặc tập tin thư viện để truy cập vào dll? –
vâng tôi có tiêu đề và nguồn của tôi – SomeUser