如何在dll中创建shared_ptr并通过工厂函数导出它?

2024-03-12

我有这段代码:

class DLL_API MyClassWrapper
{
private:

    MyClass * m_myClass;

public:
    MyClassWrapper(SIZE inputSize);
    ~MyClassWrapper();
     inline int OutputSize();

}
typedef  std::shared_ptr<MyClassWrapper> MyClassWrapperPtr;

extern "C"
{
     DLL_API MyClassWrapperPtr CreatreMyClassWrapper(SIZE inputSize)
     {
          return std::make_shared<MyClassWrapper>(inputSize);
      }
}

但它不起作用,并出现错误:

Error   1   error C2526: CreatreMyClassWrapper: C linkage function cannot return C++ class 'std::shared_ptr<_Ty>'   

我明白这个问题,但我该如何解决它?

我可以看到的选项是:

1-不要传递共享指针。这意味着 DLL 用户应该在使用后删除该指针。

2-不要使用 extern "C" :这意味着我必须使用损坏的名称。

还有其他解决办法吗?


开门见山,从 C 函数返回 C++ 对象 - 只需通过输出参数返回它:

extern "C"
{
     DLL_API void CreatreMyClassWrapper(SIZE inputSize, SomeClass* outputPtr)
     {
          *outputPtr = SomeClass(....);
     }
}

在你的例子中SomeClass == MyClassWrapperPtr, so:

extern "C"
{
     DLL_API void CreatreMyClassWrapper(SIZE inputSize, MyClassWrapperPtr* outputPtr)
     {
          *outputPtr = make_shared<MyClassWrapper>(inputSize);
     }
}

然而,请考虑稍微改变一下你的界面,因为在当前的情况下,你需要确保你的应用程序和 DLL 应使用相同的编译器、链接器、设置、库...*

您可能想要导出Create and Delete从您的 DLL 中确保内存管理将在您的 DLL 中进行(这是基于此answer https://stackoverflow.com/a/1605833/1463922:

DLL

extern "C"
{
     DLL_API MyClassWrapper* CreateMyClassWrapper(SIZE inputSize)
     {
          return new MyClassWrapper(inputSize);
     }
     DLL_API void DeleteMyClassWrapper(MyClassWrapper* wrapper)
     {
          delete wrapper;
     }
}

应用

     shared_ptr<MyClassWrapper> myClassWrapper(CreateMyClassWrapper(inputSize), 
                                               DeleteMyClassWrapper);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在dll中创建shared_ptr并通过工厂函数导出它? 的相关文章

随机推荐