代码之家  ›  专栏  ›  技术社区  ›  Shachar

从DLL动态导入C++类

  •  13
  • Shachar  · 技术社区  · 16 年前

    从DLL导入C++类的正确方法是什么?我们使用Visual C++。

    有DLReuts/Extutix.DeF+LoopStudio+GETPosiLeTrIFCTA,但它在C++类上没有作用,只有C函数。这是因为C++名字的缩写吗?我该怎么做?

    5 回复  |  直到 11 年前
        1
  •  12
  •   g19fanatic    11 年前

    您需要添加以下内容:

    extern "C"
    {
    ...
    }
    

    以避免功能损坏。

    您可以考虑编写两个简单的C函数:

    SomeClass* CreateObjectInstace()
    {
        return new SomeClass();
    }
    
    void ReleaseObject(SomeClass* someClass)
    {
       delete someClass;
    }
    

    通过使用这些函数,您可以在以后添加/更改对象创建/删除的功能。这有时被称为工厂。

        2
  •  5
  •   Shachar    16 年前

    在找到解决方案 http://www.codeproject.com/KB/DLL/XDllPt4.aspx

    谢谢你们的努力,伙计们和女孩们。

        3
  •  2
  •   titanae    16 年前

    我通常声明一个接口基类,在我的应用程序中使用这个声明,然后使用loadLibrary、getProcAddress来获取工厂函数。该因子始终返回接口类型的指针。

    这是一个实际的例子, exporting an MFC document/view from a DLL ,动态加载

        4
  •  2
  •   Community noseratio    7 年前

    退房 this question . 基本上,有两种方法。您可以使用_dllexport标记类,然后与导入库链接,将自动加载dll。或者,如果您想自己动态加载dll,可以使用@Titanae建议的工厂函数思想。

        5
  •  1
  •   gbjbaanb    16 年前

    dllexport/dllimport工作正常,将它放在头文件中类名之前,您就可以开始了。

    通常,您希望在dll中使用dllexport,在exe中使用dllimport(但您可以在任何地方都使用dllexport,它工作正常,执行“正确”操作会使加载速度稍快)。

    显然,这是为了链接时间编译。您可以使用/delayoad链接器指令使其“动态”,但这可能不是您想要的主题行。

    如果你真的想要一个加载库样式加载,你将不得不用C++“C++”函数包装你的C++函数。问题是因为名字有误,你可以输入完全有误的名字,这样就可以了。

    解决方法通常是提供一个C函数,该函数返回指向正确类的指针-com的工作方式是这样的,因为它从一个dll中导出4个C函数,该dll用于获取dll中对象内部的接口方法。