exe和dll之间的接口与不同的C/C++运行时库
给定:Executable使用dll.它们具有不同的c / c运行时.它们之间的接口有哪些限制?
除了他们使用相同的编译器,相同的Boost版本(但不同的预编译的升压库). 我知道不同的运行时可以有不同的堆.因此,delete必须与同一堆中的new对应. 最重要的是我们无法通过接口STL对象传递,因为当我们构建exe时,STL对象与一个运行时链接 让我们考虑一下案例: >我认为以下是安全的. Dll导出函数,该函数具有参数:对包含私有STL类作为成员的导出用户定义类的引用. 此外,我想使用一些智能指针来传递对象(在第3项中提到)从exe到dll以及从dll到exe的引用. 对于第1项中的对象,我想使用自定义智能指针,它将调用指向对象的释放方法 没有提到哪些问题?请纠正我. 解决方法
您的问题的一般答案是:如果实际执行的操作不依赖于运行时,对从EXE / DLL接收的对象执行某些操作是安全的.例如. vtable调用,函数指针调用,DLL的显式函数调用.
依赖于运行时的事情(来自头文件的内联方法,任何对STL对象布局做出任何假设的事情等)都是不安全的. 回到你的例子: >如果调用Release()方法,则应该小心并确保从DLL调用Release()的实现,而不是编译器生成EXE文件所创建的另一个实现.确保它的最简单方法是使Release()成为虚拟的,这样调用总是使用vtable中的方法指针(由DLL提供)调用. 备注: 有一些低概率的东西可能导致上面没有提到的问题: >如果使用不同的编译器,默认情况下它们可能会使用不同的调用约定(cdecl / stdcall). 总结一下,建议查看Microsoft COM中的实现方式并设计类似的东西.即将EXE / DLL交互限制为: >接口.即仅使用纯虚方法的C类.使用虚拟Release()删除对象. struct MyStruct { ... }; C_ASSERT(sizeof(MyStruct) == ...); C_ASSERT(FIELD_OFFSET(MyStruct,MyMember) = ... ); >类C函数传递和/或返回指向接口的指针.>不要从EXE调用的方法中抛出异常 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 我可以在临时结果中溢出uint32_t吗?
- winapi – 在Windows 7上禁用Ctrl Alt Del
- Microsoft Visual Studio和C#:如何将事件视觉添加到控件?
- windows-phone-7 – Windows Phone下拉列表
- 在Windows 8 RTM中的.NET应用程序中嵌入Powershell v2.0
- filezilla在windows上搭建服务器
- 如何防止我的.Net dll被添加为参考?
- windows远程桌面工具下载多用户登陆
- 如何使用Windows命令行查找文件中字符串的出现次数?
- windows-runtime – Windows 8应用程序支持的URI方案