Tôi đọc một số tài liệu mà đưa ra ví dụ đơn giản về các chức năng tương thích với C.Làm thế nào tôi có thể nhập dll của một ++ lớp C bên trong một không gian tên
__declspec(dllexport) MyFunction();
Tôi okey với điều đó. Tôi viết một ứng dụng nhỏ sử dụng các chức năng của dll này. Tôi đã sử dụng liên kết rõ ràng với
LoadLibrary()
chức năng. Các chức năng kiểu C hoạt động không có vấn đề gì. Nhưng khi tôi viết lớp của tôi là
namespace DllTest
{
class Test
{
public:
__declspec(dllexport) Test();
__declspec(dllexport) void Function(int);
__declspec(dllexport) int getBar(void);
private:
int bar;
};
}
#endif
nó biên dịch tốt và tạo ra Dll. Trong khi làm việc với các hàm kiểu C, tôi chỉ đơn giản là lấy một con trỏ hàm từ các hàm LoadLibrary() và GetProcAddress (...).
sử dụng trước đây của tôi là
typedef void (*Function)(int);
int main()
{
Function _Function;
HINSTANCE hInstLibrary = LoadLibrary(TEXT("test.dll"));
if (hInstLibrary)
{
_Function = (Function)GetProcAddress(hInstLibrary,"Function");
if (_Function)
{
// use the function
Nhưng bây giờ tôi không có ý tưởng làm thế nào tôi có thể nhanh chóng lớp học của tôi? Tôi có thể sử dụng liên kết rõ ràng hoặc liên kết ngầm như thế nào?
Bất kỳ trợ giúp nào về mẫu mã sẽ được đánh giá cao.
Hai điểm: đầu tiên, 'TestInterface' không cần (cũng không nên có) thành viên dữ liệu cá nhân, và thứ hai, nếu anh ta chuyển tên của hàm vào' GetProcAddress', hàm tốt nhất là 'extern "C" '(nếu không, anh ta phải truyền tên bị xé). Và tất nhiên, trong 'allocate_test', bạn có nghĩa là để làm' trả về kiểm tra mới; ', không phải' trả về TestInterface(); '(mà sẽ không biên dịch). –
Bạn nói đúng, tôi đã làm điều đó một cách nhanh chóng và bỏ lỡ một vài điều. – mfontanini