Delphi 调用DLL时内存访问异常

Delphi 调用DLL时内存访问异常,delphi,dll,memory-leaks,windows-xp,Delphi,Dll,Memory Leaks,Windows Xp,我以前问过一个关于在Delphi()中使用C库的问题。在你的帮助下,我可以打电话给它。除了在一台特定的机器上函数返回一个随机字符串外,在大约20台PC上一切都很顺利。这台机器由赛扬x86处理器供电,因此它不是64/32位问题 有谁能帮我确定为什么这会发生在那台特定的机器上(而不是在任何其他机器上)?为了能够回答上述问题,我们应该知道PC上运行的操作系统无法返回正确的答案,以及其他操作系统。没有这些,我只能猜测问题的原因。可能是: 操作系统问题-运行的操作系统是否提供了功能?(例如:home e

我以前问过一个关于在Delphi()中使用C库的问题。在你的帮助下,我可以打电话给它。除了在一台特定的机器上函数返回一个随机字符串外,在大约20台PC上一切都很顺利。这台机器由赛扬x86处理器供电,因此它不是64/32位问题


有谁能帮我确定为什么这会发生在那台特定的机器上(而不是在任何其他机器上)?

为了能够回答上述问题,我们应该知道PC上运行的操作系统无法返回正确的答案,以及其他操作系统。没有这些,我只能猜测问题的原因。可能是:

  • 操作系统问题-运行的操作系统是否提供了功能?(例如:home edition windows版本不支持域。)(尝试在具有相同操作系统的其他计算机上运行(不仅是主要版本,如2000/Me/XP/Vista/7等,还包括home/Enterprise/Ultimate等版本)
  • 内存管理问题是否为被调用函数正确保留了内存?如果传递的缓冲区太小,某些函数会返回乱码。(解决方案尝试传递一个非常大的缓冲区,以查看传递的缓冲区是否仍然包含胡言乱语。)
  • 呼叫约定问题-您是否检查了是否使用了正确的呼叫约定?(解决方案制作一个使用stdcall的调试生成,并在非工作机器上尝试。)
  • 与功能相关的问题-我不知道此DLL的功能是什么。它会优雅地失败吗?是否有可能返回的值看起来只是胡言乱语?(解决方案:检查DLL文件的文档。)
  • Unicode Ansi转换错误-您可能会在不知道的情况下将Unicode字符串计算为Ansi或vica。(解决方案:尝试使用
    GetCID(pWideChar(prm)、pWideChar(uCID)
    约定查看错误是否消失))
  • 硬件错误(不太可能)如果出现RAM错误,所有响应都可能是随机的。(SOUTION:尝试在另一台配置完全相同的计算机上运行您的程序。如果运行良好,请在电脑上运行内存测试,但结果不正确。)
要获得更准确的帮助,我需要运行计算机的更多信息:

  • 操作系统(不仅是2000/Me/XP/Vista/7等主要版本,还有Home/Enterprise/Ultimate等版本)
  • 处理器类
关于问题本身:

  • 一些代码示例在被指控的PC上失败,在其他PC上运行良好。 (包括内存保留。)
  • 调用前后CPU窗口的屏幕截图
  • 不要忘记显示/描述在运行代码的计算机上发生的情况!(它也可能在那里失败,但由于突发条件,失败被隐藏起来。)

没有任何细节,我们无法帮助您。@David:您需要什么样的细节?我在一个单独的单元中创建了这个函数,并在while块中调用它。我在动态SQL中使用结果(更新数据库)。因此,在这台特定的机器上,我得到的不是一系列数字,而是20个字符(如预期的长度),但不是实际函数调用的结果。是否有任何特定的方法来描述结果,以帮助识别问题?我们完全不知道这个函数是什么。我们究竟怎么知道它失败的原因呢。您没有提供任何详细信息、代码和调试诊断。听起来CidGen32.dll中的GetCid函数是罪魁祸首。显示代码。事实证明,@mg30rg为我提供了足够的提示,因此我找到了解决方案/解决方法。我注意到这些机器(dll/示例程序不工作的地方)都是WinXP SP2。我升级到SP3,一切正常。然而,现在我有了新的问题。为什么它在SP2上不起作用?它与2个C++ DLL有关吗?如果它们只是在可执行文件的文件夹中,不能按预期工作,为什么不不断返回错误?另外,如果我只是解释性地安装C++ 2010可重分配,为什么不工作呢?