如果之前已经问过这个问题,请原谅我,但我保证我看了很多,找不到任何东西(也许我无法提出正确的搜索条件)。
在这种情况下,我有一个基于MFC90的DLL,它导出一个类(并在头文件中使用MFC对象,如CString
,POSITION
等),我们称之为DLL的 ONE 即可。由于我只能访问VS2010,我只能在MFC100上构建基于MFC的DLL和应用程序,我还有另一个DLL,我们称之为 TWO ,它使用从DLL导出的对象 ONE 即可。到目前为止它似乎工作正常,但我想知道在将使用MFC100构建的DLL链接到使用MFC90构建的DLL时,或者如果它是一个微不足道的问题,我是否应该真正期待一些错误或奇怪的怪癖。
的 的 **注* *
的 的 **编辑* *
CString
或POD结构,例如POINT
& POSITION
。 答案 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的合并模块,就不用担心了。