我为我的应用程序开发了一个插件系统。 我的软件是用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;
,但我怎么能以安全的方式做到这一点?
答案 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的问题。