2

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

你能给我举个例子吗?

4

2 回答 2

3

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

但是请注意,DLL 接口停在那里,并且您(通常)没有共享内存管理,并且您通常不能通过例如 anstd::vector并期望 DLL 能够访问push_back新元素。原因是 DLL 通常有自己的内存管理器和堆,与调用者分离(毕竟 DLL 可以从任何语言调用,不一定是 C++)。

即使传递一个std::map并拥有 DLL 并且仅仅读取它可能会令人惊讶,因为标准库中的某些容器依赖于“哨兵”,并且这些容器也可以为 DLL 复制。

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

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

于 2012-10-19T04:49:08.020 回答
0

你是怎么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

于 2012-10-19T07:56:38.510 回答