[英]How can I import dll of a C++ class inside a namespace
我讀了一些文檔,給出了與C兼容的功能的簡單示例。
__declspec(dllexport) MyFunction();
我很開心。 我寫了一個小應用程序使用這個dll的功能。 我使用顯式鏈接
LoadLibrary()
功能。 C風格的功能沒有問題。 但是當我把我的班級寫成
namespace DllTest
{
class Test
{
public:
__declspec(dllexport) Test();
__declspec(dllexport) void Function( int );
__declspec(dllexport) int getBar(void);
private:
int bar;
};
}
#endif
它編譯得很好,並且創建了Dll。 使用C風格函數時,我只是從LoadLibrary()和GetProcAddress(...)函數中獲取函數指針。
我之前的用法是
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
但現在我不知道如何實例化我的課程? 我如何使用顯式鏈接或隱式鏈接?
任何有關代碼示例的幫助將不勝感激。
如果您正在嘗試實例化一個類,那么您需要在編譯時知道它的結構。 您可以通過創建一個抽象類來實現此目的,該類定義導入的類必須重新定義的實例方法。 例如:
//interface.h
class TestInterface
{
public:
virtual void Function( int ) = 0;
virtual int getBar(void) = 0;
};
然后,在您的DLL中,您可以包含interface.h,繼承TestInterface並重新定義純虛方法:
//test.h
namespace DllTest {
class Test : public TestInterface
{
public:
Test();
void Function( int );
int getBar(void);
private:
int bar;
};
};
然后,您可以在DLL中定義一個分配Test對象的函數:
extern "C" __declspec(dllexport) TestInterface *allocate_test() {
return new DllTest::Test();
}
最后,當您導入DLL時,查找符號“allocate_test”並使用它:
TestInterface *(*test_fun)() = (TestInterface *(*test_fun)())GetProcAddress(hInstLibrary,"allocate_test");
TestInterface *test_ptr = test_fun();
test_ptr->Function(12); //use you object
首先,請注意這是微軟的特殊性。 其他系統將適用不同的規則。
像你一樣寫東西不起作用,或者至少是痛苦的。 您需要在定義函數的DLL中使用__declspec(dllexport)
,而在編譯調用其他DLL函數的代碼時使用__declspec(dllimport)
。 處理此問題的常用方法是使用一些指定DLL的特定宏名稱,並執行以下操作:
#ifdef __WIN32
#ifdef MYMODULE_DLL
#define MYMODULE_EXPORT __declspec(dllexport)
#else
#define MYMODULE_EXPORT __declspec(dllimport)
#endif
#else
#define MYMODULE_EXPORT
#endif
將它放在DLL中包含在所有標頭中的標頭中,並在項目的命令行中定義MYMODULE_DLL
。
此外,還可以導出整個班級:
class MYMODULE_EXPORT DllTest
{
// ...
};
這具有導出或導入類的所有函數和靜態成員的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.