【问题标题】:Dynamically importing a C++ class from a DLL从 DLL 动态导入 C++ 类
【发布时间】:2008-09-21 11:52:00
【问题描述】:

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

有 dllexport/exports.def+LoadLibrary+GetProcAddress 三重奏,但它不适用于 C++ 类,只能用于 C 函数。这是由于 C++ 名称修改造成的吗?我该如何完成这项工作?

【问题讨论】:

    标签: c++ windows dll import


    【解决方案1】:

    您需要添加以下内容:

    extern "C"
    {
    ...
    }
    

    避免函数损坏。

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

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

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

    【讨论】:

    • 此代码允许您使用 C 接口创建类,但请注意,仍然需要使用 GetProcAddress 加载类的所有方法,这仍然需要名称修改或其他 C 函数(例如, void SomeObject_SomeMethod(SomeClass* const thisPointer, const int someArg){thisPointer->SomeMethod(someArg);} 用于您在对象上使用的每种方法。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      dllexport/dllimport 有效,将它放在头文件中你的类名之前,你就可以开始了。

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

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

      如果你真的想要一个 LoadLibrary 风格的加载,你将不得不用“extern C”包装器来包装你的 C++ 函数。问题是由于名称重整,您可以输入完全重整的名称,它会起作用。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-30
            • 2010-09-06
            • 1970-01-01
            • 1970-01-01
            • 2011-09-06
            • 1970-01-01
            • 2011-11-06
            相关资源
            最近更新 更多