看看这个报错是为什么?(100分)

  • 主题发起人 主题发起人 tomni
  • 开始时间 开始时间
T

tomni

Unregistered / Unconfirmed
GUEST, unregistred user!
Access violation at address 00471092 in module 'sss.exe' read of address 00000220
编译时没有错,忽略后也能正常运行。
请问这是为什么?如何解决?
 
跟踪出错行不就知道了,一般这样的错误都是可以跟踪到的。如指针未初始化,第三
方控件等问题。
 
一般都是指针问题, 贴上来source.
 
这种错误什么时候,进行什么操作时出现?
呵呵,好眼熟!
 
哈,找到了
Access violation at address 0048412E in module 'Project1.exe'.Read
of address 000002c4
很像吧!
这是我调用了一个未创建的form中的参数,造成的错误。看看对不对。程序如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from try where a='+form2.edit1.text);//form2尚未创建或以关闭
query1.ExecSQL;
end;
 
kchsun: 拜托!在delphi里,任何不正确的内存访问都会出现这样的信息.
 
cAKK:对不起,我只是把个人曾有的错误提出来,供大家参考,到没想那么多,不
好意思,是太弱了吗?
 
No,我随便说说,没别的意思. :-)
 
呵呵, 有时是delphi的bug的说:-)
关键得看source才能判断哪里出错.
 
是的是的,把源程序贴出来让大家看看也好嘛,吸取经验不范错误
不过Delphi报错很多都是这样的信息
 
只有一种可能:
访问了(确切说是读)一个已经释放了的变量或类中的内容. 因为地址有($00000220)
说明这个地址曾经分配过一块内存, 但是已经释放掉了, 而某个指针却没有
相应置为nil, 仍指向这个地址. 你的程序在使用这个非法指针进行读操作.
 
Access violation at address ×××××××× in module……
之类的问题应该出现在函数调用模式上。Delphi 支持五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。
  如何选择调用模式,有以下三条规则:
  1.Delphi使用register模式作为缺省调用模式以提高运行效率。
  2.如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。
3.如果要实现双界面函数和过程,应使用safecall模式。
  所以解决问题只要选用stdcall模式即可,Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:
  void(FAR PASCAL *Imp_ Connect)(unsigned short far*,short far*);
  void(FAR PASCAL *Imp_ Init)(short far*,short far*);
  相应的在Delphi下DLL函数引入说明为:
  procedure Imp_ Connect(var CardAddress:word;var CardHandle:smallint);stdcall;
  procedure Imp_ Init(var Poll_Tab:smallint;var ErrorFlag:smallint;var CardHandle:smallint);stdcall;
  
 
时间太久,强制结束。 wjiachun
 
后退
顶部