我的工作面临以下问题:有两个项目:基于相同源代码的MFC .dll和MFC .exe(当然除了入口点),我观察到它们在处理相同数据时产生的不同结果。我检查了两者的所有项目设置,发现所有项目属性相似(至少我认为很重要)。经过几次测试后,我学会了以下内容:
我认为.exe正常工作只是因为它为两个编译器配置提供了相同的结果,但我无法确定。那么,这个带有.dll'Release'配置的问题如何解决?我的意思是,我怎么能强迫它与其他人一致?什么能解释这种行为?
修改
我猜问题出现是因为我使用Delphi编写的主机应用程序。我甚至创建了新的C ++ exe来测试这个建议,看到它正常工作,没有任何错误。唯一不同的是创建用于Delphi应用程序的DLL我将其标记为 extern“C”,但对于C ++应用程序,我只写了 extern 。有关此主题的另一个讨论的详细信息可以在here找到。但是如果尝试使用只有 extern 标记的DLL,没有“C”,我的Delphi应用程序会报告无法找到函数入口点...它是一个对我来说现在的大问题为什么会发生这种情况......有什么想法?
答案 0 :(得分:1)
检查每个主机的8087控制字的值。我很确定Microsoft C使用的值与Delphi使用的值不同。在最近的Delphi版本中,您可以使用Set8087CW等函数以及SetPrecisionMode和SetRoundMode等包装器。但是您可能希望在DLL中专门设置它们,然后在计算结束时将它们恢复为原始值。
答案 1 :(得分:0)
如果没有一些代码示例,很难回答这个问题。但有一点需要考虑的是,您的数据处理代码是否使用了调用处理器的代码也使用的全局数据结构。
Dll创建自己独立的地址空间,默认情况下可以访问不同的全局数据结构集。
假设您有一个全局表,用于制表主代码中使用的结果和处理代码。
在一个exe中的版本中,它们都将使用相同的表。在dll版本中,处理dll将使用一组全局变量,并且链接到它的exe使用不同的版本。