1

如果以前有人问过这个问题,请原谅我,但我保证我看了很多遍,找不到任何东西(也许我只是想不出正确的搜索词)。

情况是这样的,我有一个基于 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% 确定的,但我不相信这些类使用的不仅仅是,或者像&这样的CStringPOD 结构。POINTPOSITION
4

3 回答 3

1

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

于 2012-10-03T02:26:15.350 回答
1

若要传递 MFC 派生对象或指向 MFC 对象和 MFC 分配的内存的指针,您必须构建扩展 DLL。我假设您有一个 MFC 扩展 DLL 项目。如果您在结构中嵌入了一个复杂的 MFC 对象,例如 CView,那么您可能正在嵌入一个指向 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 中非常频繁地调用。

于 2012-10-06T00:09:06.417 回答
0

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

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

于 2012-10-03T07:28:03.157 回答