简洁版本
将区域设置更改为使用“.”作为小数点分隔符而不是“,”。
应用程序被编码为使用它所运行的计算机的区域设置/文化,这可能会随着时间的推移而改变。
所以,检查控制面板区域 -> 格式 -> 其他设置 -> 小数点符号 value.
如果您的数据库已将值存储在一个区域中并尝试将其加载到另一区域中,则它将失败,如上所述。
完整版
几天后,我设法深入兔子洞找到了问题。
首先,我在干净的虚拟机上尝试了该应用程序。我从 SysInternals 运行 ProcMon 来监视所做的一切。我监视注册表项、磁盘访问等。寻找出现错误的内容。那里没有运气。
我认为这可能是数据库驱动程序问题,或者我缺少某些 ODBC 连接或其他问题,但不,我尝试打开 ODBC 跟踪,但没有记录任何内容。我尝试按照其他地方的建议安装2010 Office System驱动程序,但这并没有解决任何问题。
我尝试了 32 位和 64 位 Windows 10 版本,都有这个问题。
然后,我进入了 exe 代码并尝试了一些工具,例如 IDR(交互式 Delphi 重构器),以查看我可以看到哪些字符串。我正在寻找数据库连接信息。数据库被硬编码以访问.mdb
使用连接字符串的文件Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=xxxxx;Persist Security Info=False;Data Source=
所以我尝试更改要使用的字符串Microsoft.Jet.ACE.12.0
相反,并使用 PE Explorer、Resource Tuner、DeDe、ResEdit、Resource Hacker 等工具。但仍然无法使用新的数据库连接字符串版本重新编译/保存来工作。
然后我决定需要查看错误的原因是什么,因此我需要以某种方式调试这个应用程序,以便我可以看到异常的真正原因。我刚刚收到一个通用异常 0x0EEDFADE。所以我抓住了WinDbg
检查发生了什么。我涉足procdump
也。但 WinDbg 为我提供了所需的堆栈跟踪,并使用了以下技术https://marc.durdin.net/2012/08/ located-delphi-exceptions-in-a-live-session-or-dump-using-windbg/ https://marc.durdin.net/2012/08/locating-delphi-exceptions-in-a-live-session-or-dump-using-windbg/,我设法在一个例外中找到了这一点:“‘2.2’不是有效的浮点数”
这个异常让我很困惑,但后来我意识到系统上的数字格式可能不同,“,”与“。”机器的区域设置/区域的问题。
事实上,Windows 10 决定将小数点分隔符的默认区域设置更改为逗号,而不是南非的句号。毫无疑问,许多其他遗留或较旧的应用程序编码不正确,但在 Windows 10 之前运行良好,将因为这个问题而停止工作。