2

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

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

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

编辑

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

4

2 回答 2

1

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

于 2012-06-20T16:56:35.840 回答
0

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

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

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

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

于 2012-06-19T16:16:06.353 回答