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