使用从DLL导出的MFC90类和使用MFC100构建的DLL

Using MFC90 Class exported from DLL with DLL built with MFC100

本文关键字:DLL 构建 MFC100 MFC90      更新时间:2023-10-16

如果以前有人问过这个问题,请原谅,但我保证我仔细查看了一遍,什么都找不到(也许我就是找不到合适的搜索词)。

在这种情况下,我有一个基于MFC90构建的DLL,它导出一个类(并在头文件中使用MFC对象,如CStringPOSITION等),我们将此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的合并模块,就不用担心。