德尔福计划& Windows 64位兼容性问题

时间:2011-02-03 11:26:56

标签: windows delphi 64-bit compatibility

我有一些客户/候选人抱怨我的程序无法在Windows 7 64位版本上运行(通过屏幕截图确认)。错误很奇怪,例如:

  

我试用版   每当我得到一条错误消息   点击\“mark \”\“删除\”\“帮助\”。

     

错误消息是:访问冲突在   地址0046C978在模块中   \'ideduper.exe。\'读取地址   00000004

     Windows 7终极64位。 i7 920   @ 2.67GHz 9gb或ram

'Mark','delete'和'help'只是TToolbar上的标准TToolButton。

另一个例子是无法从IExtractImage获取缩略图。

我告诉他们尝试兼容模式,但仍然无效。

问题是当我在计算机上的Windows 7 HP 64位上测试它时(我在实际发布它之前已经完成了它)它运行正常!所以我不知道是什么导致它

你有什么建议吗?不同的Windows软件包(家庭基本版,高级软件版,终极版等)是否会以不同的方式处理32位编程?Delphis(我使用2006)的新版本是否与64位Windows更兼容?我需要等到64位编译出来吗?

提前致谢

6 个答案:

答案 0 :(得分:10)

我认为您最好的选择是添加MadExcept或EurekaLog或类似于您的应用程序的东西,并将其交给客户再试一次。 MadExcept将生成带有堆栈跟踪的日志,这将使您更清楚地了解那里发生的事情。

要回答问题的第2部分,32位Delphi程序在64位Windows 7上运行良好。我认为您更有可能遇到一些内存管理问题,而客户恰好偶然发现它们。使用FastMM4跟踪它们。

答案 1 :(得分:3)

您的应用程序正在尝试访问无效指针。不断变化的环境可能会掩盖其他人隐藏的问题。检查您的应用程序,并使用FastMM + JCL + JCVL / MadExcept / EurekaLog来详细跟踪问题。某些Windows API可能在7位和/或64位下有一些更严格的调用必需品,但我们必须知道您的应用实际上是什么类型的。

答案 2 :(得分:3)

MadExcept的免费替代品是JCL Debug的东西。但是它不太彻底,并且不包括用于通过电子邮件将堆栈跟踪发送给您的酷对话框,或者作为可以附加和手动发送电子邮件的文件。

MadExcept非常值钱,非商业用途是免费的。你可以先在自己的电脑上试一试,观察它的功能,并确保它按照你想要的方式运行,然后购买它。

如果购买德尔福是值得的(它是!)然后购买疯狂除了是没有脑子。但是如果你坚持自己滚动,JCLDebug(jedi代码库的一部分)也很不错。

答案 3 :(得分:1)

为他们提供应用程序的精简版本,并查看问题何时消失。我打赌这是你的代码,因为我的(数百个)W7 / 64客户端从未遇到任何问题。

答案 4 :(得分:0)

我愿意打赌你的代码中存在问题。它在您的客户机器上而不是您的机器上失败的原因是您的机器可能启用了默认的数据执行保护(DEP)(仅对基本的Windows程序和服务启用),而您的客户的计算机实际上正在按预期使用DEP (打开所有程序和服务)。

默认设置(与旧版本的Windows兼容,如95/98 / ME)允许软件从应该是数据段的代码执行代码。更严格的设置将不允许这样做,而是引发系统级异常。

您可以通过查看系统属性来检查两者之间的设置。我现在不在Win7机器上,但是在WinXP上,右键单击“我的电脑”,选择“属性”,单击“性能选项”,然后选择“数据执行保护”选项卡。使用帮助在Vista / Win7上找到它;搜索数据执行保护。

正如之前的答案告诉你的那样,解决方案是安装MadExcept或EurekaLog。您还可以在JCLDebug IIRC中获得免费版本JEDI的一部分。我没有用它,所以我不能亲自担保。不过我听说它很不错。

如果您不想走这条路线,请在应用的启动部分的某处设置断点(确保在打开调试信息的情况下进行构建)。运行您的应用程序,直到命中断点,然后使用IDE的Search-> Goto地址(在命中断点之前禁用)。在$ 0046C978中输入异常对话框中的地址(不是几乎全为零的地址,而是0046C978地址,前缀为$以表示它是十六进制)。您可能最终会在CPU窗口中查看汇编代码,但您通常可以选择某种类型的Delphi代码,这些代码有时会为您提供一个开始查找的位置。

答案 5 :(得分:0)

除了之前的所有建议之外,我还将添加与W32相比在WOW64下访问注册表的区别。如果您的应用程序正在访问注册表以读取或写入某些设置,您应该知道这一点。首先,请查看MSDN中的thisthis页面。在this页面上,您将找到2个标志,用于确定从32位或64位应用程序访问Registry的访问权限。 KEY_WOW64_64KEY是你应该使用的那个。

在任何情况下,我都同意其他人使用madExcept(或任何其他类似工具)来找到问题的确切原因。