MFC .exe 和 .dll 为相同的代码产生不同的结果 [关闭]

Posted

技术标签:

【中文标题】MFC .exe 和 .dll 为相同的代码产生不同的结果 [关闭]【英文标题】:MFC .exe and .dll produce different resuls for same code [closed] 【发布时间】:2012-06-19 14:49:37 【问题描述】:

我的工作遇到了以下问题:有两个项目:基于相同源代码的 MFC .dll 和 MFC .exe(当然入口点除外),我观察到它们在处理相同数据时产生的不同结果。我检查了两者的所有项目设置,发现所有项目属性都相似(至少那些我认为很重要的)。在运行了几次测试后,我了解到以下内容:

    MFC .exe 在“调试”和“发布”模式下对同一数据集产生相同的结果 MFC .dll 在“调试”和“发布”模式的相同数据集上产生不同结果 .dll 的“发布”结果与 .dll 的“调试”结果不匹配,也不与 .exe 的“调试”或“发布”结果匹配。

我认为 .exe 工作正常只是因为它为两种编译器配置提供了相同的结果,但我无法确定这一点。那么,如何解决 .dll 'Release' 配置的问题呢?我的意思是,我怎么能强迫它与其他人一致?什么可以解释这种行为?

编辑

我猜出现问题是因为我使用的是在 Delphi 上编写的主机应用程序。我什至创建了新的 C++ exe 来测试这个建议,发现它运行正常,没有任何错误。唯一的区别是创建用于 Delphi 应用程序的 DLL 我将它标记为 extern "C",但对于 C++ 应用程序我只写了 extern。可以在here 找到有关此主题的另一个讨论的详细信息。但是,如果尝试使用仅带有 extern 标记的 DLL,而没有 "C",我的 Delphi 应用程序会报告函数入口点无法位于那里...这是一个现在对我来说是个大问题,为什么会发生这种情况......有什么想法吗?

【问题讨论】:

结果到底是什么意思?请发布一些代码和实际输出。 您不会通过修改项目设置来调试代码。使用调试器。 嗯,实际上有很多代码 - 可能有 15 个左右的文件,我想这很难分析。 【参考方案1】:

检查每个主机的 8087 控制字的值。我很确定 Microsoft C 使用的值与 Delphi 使用的值不同。在较新的 Delphi 版本中,您拥有诸如 Set8087CW 之类的函数以及诸如 SetPrecisionMode 和 SetRoundMode 之类的包装器。但是您可能希望在 DLL 中专门设置它们,然后在计算结束时将它们恢复为原始值。

【讨论】:

谢谢你的建议,我会试试看。顺便说一句,我曾经在旧的 TURBO PASCAL 编译器中遇到 8087 预处理器的一些问题,但我认为此时它们已经消失了。好的,谢谢,我会告诉你是否有帮助。 在搜索有关您提出的方法的文档时,我发现了另一种方法:设置 CLR 支持(以前没有设置)。现在效果很好。 @Rail 用你的解决方案写一个答案,然后接受它。最好让答案得到正式认可。 好吧,这并没有解决问题,所以我放弃了这个方法。将 Set8087CW($027F) 添加到 Delphi 代码目前解决了观察测试的问题。【参考方案2】:

如果没有一些代码示例,很难回答这个问题。但要考虑的一件事是,您的数据处理代码是否使用了调用处理器的代码也使用的全局数据结构。

Dll 创建自己的独立地址空间,默认情况下可以访问一组不同的全局数据结构。

假设您有一个全局表,用于将在主代码和处理代码中使用的结果制成表格。

在一个 exe 中的版本中,它们都将使用同一个表。在 dll 版本中,处理 dll 将使用一组全局变量,而链接到它的 exe 使用的是不同的版本。

【讨论】:

以上是关于MFC .exe 和 .dll 为相同的代码产生不同的结果 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在共享DLL中使用MFC与在静态库中使用MFC的区别

在共享DLL中使用MFC与在静态库中使用MFC的区别

MFC——快速创建选择框

非 MFC ATL 项目 (dll) 产生 MFC 相关错误

没有找到MFC42D.DLL

打开我的项目 exe 后缺少 mfc120d.dll