Delphi中的AccessViolationException - 不可能(检查它,难以置信......)

时间:2011-08-26 00:05:19

标签: delphi error-handling access-violation

Delphi XE。 Windows 7。

在大型项目中有一个功能(请参阅下面的代码)或I:=0导致AV错误。在新项目中没有相同功能的错误!我删除了大项目中的所有内容,我只留下了一个按钮和该功能。它仍会导致错误......

包含错误的行:

if ISAeroEnabled then // this line is a cause
       i:=0;         // or this line

我到处设置断点(我检查了整个函数,我在每个行 - >函数中没有错误设置断点),调试器显示错误在{{1} }

如果要删除某个功能(并离开i:=0;) - > 一切都好!

错误消息:i:=0;

为什么它在新项目中有效但在我的项目中却没有?

以下是整个项目:http://www.2shared.com/file/UP22Om4j/Bug.html

代码:

First chance exception at $747FB727. Exception class EAccessViolation with message 'Access violation at address 004AE5AF in module 'MngProject.exe'. Write of address 0017FFF8'. Process MngProject.exe (4980)

1 个答案:

答案 0 :(得分:23)

尝试将PBoolean更改为PBOOL

function(IsEnabled: PBOOL): HRESULT; stdcall;

var
  Flag: BOOL;

PBoolean是指向Pascal布尔值的指针,其大小为1个字节。 PBOOL是指向Windows(基于C)BOOL的指针,其大小为4个字节。您需要匹配windows预期的大小。

通常,在将Windows API调用转换为Delphi时,请使用与API相同的命名数据类型。 Windows.pas具有将这些类型定义映射到Delphi类型的类型定义,例如type BOOL = LongBool;

在Delphi中通常(但不是必需的)将指针参数更改为var。 var参数是用于传递引用的Pascal语法糖,在C中不可用。

function(var IsEnabled: BOOL): HRESULT; stdcall;
....
    DwmIsCompositionEnabledFunc(Flag); // no @ operator

注意:我无法测试,因为我只有XP可用。