当我在我的应用程序中关闭一个表单时,我遇到了访问冲突。它似乎只有在我访问数据库几次之后才会发生,但这似乎没有意义。
我已经跟踪并将 outputdebugstring 消息放入所有相关的 OnDestroy() 方法中,但 AV 似乎不在我的代码中。
这是消息的文本:
模块“MySoopaApplication.exe”中地址 00405F7C 的访问冲突。读取地址 00000008。
如何找到应用程序 00405F7C 的位置?
Delphi 10.1 Berlin 中有哪些工具可以帮助我解决这个问题?
编辑:添加了更多信息...单击“中断”时,IDE 总是将我带到 GETMEM.INC 中的这段代码:
@SmallPoolWasFull:
{Insert this as the first partially free pool for the block size}
mov ecx, TSmallBlockType[ebx].NextPartiallyFreePool
进一步编辑:好吧,我找到了罪魁祸首,虽然我不能老实说调试工具让我在那里 - 他们似乎只是表明它不在我的代码中。
我使用了来自网络的代码,用于查找 Windows 登录用户 - 就是这样:
function GetThisComputerName: string;
var
CompName: PChar;
maxlen: cardinal;
begin
maxlen := MAX_COMPUTERNAME_LENGTH +1;
GetMem(CompName, maxlen);
try
GetComputerName(CompName, maxlen);
Result := CompName;
finally
FreeMem(CompName);
end;
end;
一旦我用一个简单的结果替换了代码:='12345',AV 就停止了。我没有将其更改为以下代码:
function GetThisComputerName: string;
var
nSize: DWord;
CompName: PChar;
begin
nSize := 1024;
GetMem(CompName, nSize);
try
GetComputerName(CompName, nSize);
Result := CompName;
finally
FreeMem(CompName);
end;
end;
这似乎有效,并且作为奖励,不会导致 AV。
感谢您的帮助,非常感谢。