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

时间:2012-10-03 02:02:44

标签: c++ visual-studio-2010 visual-studio-2008 dll mfc

如果之前已经问过这个问题,请原谅我,但我保证我看了很多,找不到任何东西(也许我无法提出正确的搜索条件)。

在这种情况下,我有一个基于MFC90的DLL,它导出一个类(并在头文件中使用MFC对象,如CStringPOSITION等),我们称之为DLL的 ONE 即可。由于我只能访问VS2010,我只能在MFC100上构建基于MFC的DLL和应用程序,我还有另一个DLL,我们称之为 TWO ,它使用从DLL导出的对象 ONE 即可。到目前为止它似乎工作正常,但我想知道在将使用MFC100构建的DLL链接到使用MFC90构建的DLL时,或者如果它是一个微不足道的问题,我是否应该真正期待一些错误或奇怪的怪癖。


**注* *

  • 可以选择重建DLL ONE
  • 我已经找到了使用VS2010在MFC90上构建应用程序的免费选项,但我还没有成功找到解决方案。我读到我可以简单地下载Windows SDK 6.01,但是当我从Microsoft下载它时,其中没有MFC的痕迹。
  • 可以选择使用VS2008(除了VS2008 Express,MFC没有附带)。
  • 这是所有公司专有代码,因此我无法发布任何源代码。


**编辑* *

  • 我应该提到DLL TWO 导出函数,这些函数将指向DLL ONE 导出的类的指针作为其参数。
  • 所有导出的类都不是来自MFC对象的派生。导出的类仅将MFC对象用作成员变量,成员函数参数或内部成员函数。我不能说这是100%的确定性,但我不相信这些课程使用的不仅仅是CString或POD结构,例如POINT& POSITION

3 个答案:

答案 0 :(得分:1)

如果没有源假设DLL本身是专有的(代码+ MFC使用的,或者只是一个或另一个),我会想象它们与使用Microsoft提供的任何类型的DLL一样古怪。所以我确定它是微不足道的,根据我的经验,有人在它自己的DLL中为WMPLib.DLL编写了一个包装器,它的文件API没有引起任何潜在的问题但是错误处理很糟糕,从XP到vista的可移植性7并不是问题,但在错误的时间传递错误的值是。总而言之,我认为内部函数与MFC的接口编写得有多好。

答案 1 :(得分:1)

To pass MFC-derived objects, or pointers to MFC objects and memory allocated by MFC, you must build an extension DLL.我假设你有一个MFC扩展DLL项目。如果您有一个复杂的MFC对象,如嵌入在结构中的CView,那么您可能正在嵌入指向MFC对象的指针。具有已知的,与版本无关的布局(如CRect)的MFC对象可以通过。

MFC扩展dll在多个版本中无法移植。来自Extension DLLs的文档:

客户端应用程序和扩展DLL都必须使用相同版本的MFCx0.dll。

因此,您无法将MFC 9扩展DLL与MFC 10库链接。您需要让作者使用MFC10重建,或者获取VC9以获得MFC 9库。

原因是,如果你在V9类定义和V10类之间有memory layout mismatch,那么你最好会发生内存泄漏,最糟糕的是随机崩溃,如果你尝试混合两者,作为MFC对象中成员的偏移量可以在不同版本中有所不同。当你写一个地址以为它是Foo :: memberA可能会覆盖Foo :: memberB因为内存布局不同。静态变量也存储在不同的地方。如果您尝试混合MFC版本,您可能会注意到的第一个不匹配是a debug assert in the runtime class checking,这在MFC中经常被调用。

答案 2 :(得分:0)

应该开箱即用。我见过混合版MFC的项目。唯一的问题是部署。 MFC 8.0和9.0需要一个清单(并且最好部署在WinSxs中),而7.x和10.x可以简单地放在与可执行文件相同的文件夹中。

只要您拥有MFC / CRT 9.0的合并模块,就不用担心了。