【发布时间】:2012-10-19 04:38:06
【问题描述】:
如何将结构从 C++ 应用程序传递到 C++ Win32 DLL?
可以举个例子吗?
【问题讨论】:
-
您是否已经知道如何为您的 DLL 制作头文件,并从 C++ 程序调用您的 DLL 中的函数?
-
是的,但我不确定传递结构指针是否有任何问题。
如何将结构从 C++ 应用程序传递到 C++ Win32 DLL?
可以举个例子吗?
【问题讨论】:
你可以传递一个指针,因为windows中的DLL和程序在同一个地址空间。
但是请注意,DLL 接口停在那里,并且您(通常)没有共享内存管理,并且您通常不能传递例如 std::vector 并期望 DLL 能够 push_back 新元素。原因是 DLL 通常有自己的内存管理器和堆,与调用者分离(毕竟 DLL 可以从任何语言调用,不一定是 C++)。
即使传递std::map 并拥有 DLL 并仅读取它可能会令人惊讶,但仍然可能无法正常工作,因为标准库中的某些容器依赖于“哨兵”,并且这些容器也可以为 DLL 复制.
在上面我使用了“一般”一词,因为 DLL 可能有一些技巧可以与主进程共享内存管理。例如,自 VC6(但不是标准库!)以来,Microsoft MFC 就被设计为绕过这些 DLL 障碍。
您还必须确保使用完全相同的编译器和编译选项编译 DLL 和主程序,否则即使是普通结构也可能具有不同的内存布局。
【讨论】:
您的struct 是如何定义的?它是一个 POD 吗?它是一个简单的 C struct 吗?还是 struct 的成员是 STL 类的实例?
如果 struct 是“纯 C”struct,那么您可以简单地将其传递给 DLL。
但如果struct 有 STL 类作为数据成员,那么您必须确保 .EXE 和 .DLL 都使用 动态链接到 CRT,并且是使用 相同版本的 Visual C++ 编译器和与 CRT 相同的风格(例如,如果您有一个 debug-build .EXE 和一个 release-build,则不能在边界传递 STL 类.DLL,因为 STL 容器的实现从调试版本变为发布版本;如果您有一个使用 VC10 构建的 .EXE 和一个使用 VC9 构建的 .DLL,则不能在边界传递 STL 类。
此外,您可能想阅读有关 CodeProject 的这篇有趣的文章: “HowTo: Export C++ classes from a DLL”。
【讨论】: