使用从DLL导出的MFC90类和使用MFC100构建的DLL
Using MFC90 Class exported from DLL with DLL built with MFC100
如果以前有人问过这个问题,请原谅,但我保证我仔细查看了一遍,什么都找不到(也许我就是找不到合适的搜索词)。
在这种情况下,我有一个基于MFC90构建的DLL,它导出一个类(并在头文件中使用MFC对象,如CString
、POSITION
等),我们将此DLL称为ONE。由于我只能访问VS2010,我只能在MFC100上构建基于MFC的DLL和应用程序,而且我还有另一个DLL,我们称之为TWO,它使用从DLLONE导出的对象。到目前为止,它似乎还可以工作,但我想知道,当将用MFC100构建的DLL链接到用MFC90构建的DLL时,我是否真的应该预料到一些错误或奇怪的怪癖,或者这是一个微不足道的问题。
**注意**
- 我确实没有重建DLLONE的选项
- 我一直在寻找使用VS2010在MFC90上构建应用程序的免费选项,但我还没有成功找到解决方案。我读到我可以简单地下载Windows SDK 6.01,但当我从微软下载它时,里面没有MFC的痕迹
- 我没有使用VS2008的选项(VS2008Express除外,它没有MFC)
- 这都是公司的专有代码,所以我不能发布任何源代码
**编辑**
- 我可能应该提到DLLTWO导出函数,这些函数以指向DLL
ONE所导出类的指针为参数 - 导出的类都不是从MFC对象派生的。导出的类仅将MFC对象用作成员变量、成员函数参数或内部成员函数。我不能说这是100%肯定的,但我不相信类使用了
CString
或像POINT
&POSITION
如果没有源代码,假设DLL本身是专有的(代码+与之一起使用的MFC,或者只是其中一个或另一个),我会认为它们会像使用微软自己提供的任何类型的DLL一样古怪。因此,我相信这是微不足道的,根据我的经验,有人在WMPLib.DLL自己的DLL中为其编写了包装器,该文件的API没有引起任何潜在问题,但错误处理非常糟糕,从XP到vista和7的可移植性不是问题,而是在错误的时间传递错误的值。总而言之,我认为内部函数编写得如何与MFC接口才是最重要的。
若要传递MFC派生的对象,或指向MFC对象和MFC分配的内存的指针,必须构建扩展DLL。我假设你有一个MFC扩展DLL项目。如果在结构中嵌入了像CView这样的复杂MFC对象,那么您可能正在嵌入指向MFC对象的指针。具有已知的、与版本无关的布局(如CRect)的MFC对象可以通过。
MFC扩展dll不能跨多个版本移植。来自扩展DLL的文档:
客户端应用程序和扩展DLL必须使用相同版本的MFCx0.DLL。
因此,您无法将MFC 9扩展DLL与MFC 10库链接。您需要要求作者使用MFC10进行重建,或者获得VC9以获得MFC 9库。
原因是,如果V9类定义和V10类定义之间的内存布局不匹配,那么如果尝试混合使用这两种定义,最好情况下会出现内存泄漏,最坏情况下会发生随机崩溃,因为MFC对象中成员的偏移量在不同版本中可能不同。当您向一个认为是Foo::memberA的地址写入时,可能会覆盖Foo::memberB,因为内存布局不同。静态变量也存储在不同的地方。如果您尝试混合MFC版本,您可能会注意到的第一个不匹配是运行时类检查中的调试断言,这在MFC中非常频繁地调用。
应该开箱即用。我见过MFC混合版本的项目。唯一的问题是部署。MFC 8.0和9.0需要一个清单(最好部署在WinSxs中),而7.x和10.x可以简单地与可执行文件放在同一个文件夹中。
只要你有MFC/CRT 9.0的合并模块,就不用担心。
- 如何从Cygwin下构建的C++程序链接到DLL
- 为什么它无法在 c++ 中全局声明一个构建为 dll 文件的类?
- C\C++构建的dll在LabView中实时运行
- 如何在没有任何依赖库的情况下在Visual Studio中构建dll?
- MFC/DLL中缺少ATL :: CSTRINGT功能,该功能与Clang/vs-2019构建
- Microsoft Visual Studio 2008,版本9.0.30739.1 SP,DLL构建错误
- 如何在 go 中调用带有 .lib 和.dll文件的预构建 API
- 在构建服务器上将 dll C++生成到两个平台 (x86+x64)
- 复制C DLL以构建任何C#项目的输出,以扩展为参考
- 如何在C 构建器中动态声明C#DLL
- 如何在运行时构建DLL
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- 当您的外部SDK仅具有.dll,.lib,.h文件时,如何链接和构建项目
- 使用Cmake与Visual Studio 2017一起构建ssh.dll
- CodeBlocks:如何使用wxWidgets库DLL构建C++应用程序
- 如何使用Cmake为SimuroSot模拟器构建(从DevCpp转换)Win32 DLL
- 节点插件节点-gyp 构建缺少 V8 dll 的
- 调用从.NET Core中的C++项目构建的.dll时出现BadImageFormatException
- 制定目标需要32和64位的DLL构建
- 内联类函数和共享库(dll)构建