如何在DLL中返回向量?

时间:2011-03-21 03:33:19

标签: c++ c memory dll

我为我的应用程序开发了一个插件系统。 我的软件是用MFC / c ++编写的

我选择从DLL导入函数。 但我面临一个问题。 我曾经使用std库编写过,但SO告诉我“如果基于模板将任何内容传入和传出DLL,则存在危险”

所以我开始重写它。但现在我找不到一个好的解决方案。 这个dll将解析Youtube并将结果返回到这样的结构中:

struct VideoInfo{
wchar_t* strName;
wchar_t* strURL;
int iDuration;
float fRate;
};

但是其中有50个,在我之前的代码中我刚刚返回std::vector<VideoInfo*> *vecVideos;,但我怎么能以安全的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以创建链接列表并返回该列表,而不是返回矢量。

无需担心不兼容性,并且使用简单:

struct Node
{
    VideoInfo vi;
    Node *Next;
};

在制作视频列表时,请执行以下操作:

Node *ptr = new Node();
ptr->vi = MyVideoInfo; // Assumes MyVideoInfo is the new video
ptr->Next = current;
current = ptr; // Assuming current is our current linked list

你甚至可以在c中使用它,因为你只需要将它包装在extern“C”{}中并将typedef添加到节点声明的前面。

答案 1 :(得分:1)

当DLL和EXE没有使用相同的项目配置构建时,返回C ++对象是不安全的,使用/ MT而不是/ MD构建或使用不同版本的运行时库构建。在许多情况下,这不是一个实际问题,ymmv。

安全的方法是避免要求EXE释放DLL从堆分配的内存。或者相反。你需要为初学者改变你的结构,不能有wchar_t *。您可以编写导出的函数来获取VideoInfo *,以便调用者可以传递函数填充的缓冲区。

但重申一下,只要不存在DLL过时的危险,那么你就不会遇到std :: vector和std :: wstring的问题。