如何将结构从C ++应用程序传递给C ++ Win32 DLL?

时间:2012-10-19 04:38:07

标签: c++ c dll struct

如何将结构从C ++应用程序传递给C ++ Win32 DLL?

你能举个例子吗?

2 个答案:

答案 0 :(得分:3)

您可以传递指针,因为Windows中的DLL与程序位于同一地址空间中。

但是请注意,DLL接口在那里停止,你(通常)没有共享内存管理,你通常不能传递例如std::vector并期望DLL能够push_back新元素。原因是DLL通常有自己的内存管理器和堆,与调用者之一分开(所有DLL都可以从任何语言调用,不一定是C ++)。

即使传递一个std::map并且只是阅读它仍然可能不起作用可能会令人惊讶,因为标准库中的某些容器依赖于“哨兵”并且这些容器可以复制DLL也是。

在上面我使用了“一般”这个术语,因为DLL可能有一些技巧可以与主进程共享内存管理。例如,微软MFC被设计为自VC6以来在这些DLL障碍周围正常工作(但不是标准库!)。

您还必须确保使用完全相同的编译器和编译选项编译DLL和主程序,否则即使是普通结构也可能具有不同的内存布局。

答案 1 :(得分:0)

您的struct如何定义?它是POD吗?这是一个简单的C struct吗?或者它是struct,其成员是STL类的实例吗?

如果struct是“纯C”struct,那么您只需将其传递给DLL即可。

但是如果struct将STL类作为数据成员,那么您必须确保.EXE和.DLL都使用动态链接到CRT ,并使用相同版本的Visual C ++编译器相同的CRT风格(例如,如果您有调试版本.EXE和版本,则无法在边界传递STL类-build .DLL,因为STL容器的实现从调试版本变为发布版本;如果你有一个.EXE构建,例如VC10和用VC9构建的.DLL,你就不能在边界传递STL类。 / p>

此外,您可能想阅读CodeProject上这篇有趣的文章: 的HowTo: Export C++ classes from a DLL即可。