簡體   English   中英

如何在命名空間內導入C ++類的dll

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM