谁能帮我解决这个问题,出现Access violation at address 进者有分 (300分)

  • 主题发起人 主题发起人 xjzcg
  • 开始时间 开始时间
X

xjzcg

Unregistered / Unconfirmed
GUEST, unregistred user!
这段代码在执行第三次的时候出现Access violation at address XXXXXX.write of 。。。的错误,前两次都正常运行。请各位高手看看问题出在那里。

//类型定义
TFtpSitInfo=Record
Name:String[30];
Port:integer;
UserName:String[30];
PassWord:String[30];
end;
THostName=record
HostName:String[30] ;
end;
// 其中 n 是TNMFTP控件 , 直接画在窗体上的,没有动态创建

procedure TFormMain.Button8Click(Sender: TObject);
var
s:String;
p:PChar;
Sit:TFtpSitInfo;
begin
if FileExists(Extractfilepath(application.exename)+'host.cfg') then
begin
//读取配置信息
sit:=ReadFtpSitInfo(Extractfilepath(application.exename)+'host.cfg');
n.Host:=sit.Name ;<------第三次在这里出错
n.Port:=sit.port;<------n是TNMFTP控件
n.UserID :=sit.UserName;
n.Password:=sit.PassWord ;
Try
//连接服务器
n.Connect;
except
application.MessageBox('与服务器连接失败','错误',64);
exit;
end;
//下载主机地址
Try
n.Download('host/host.zcg',Extractfilepath(application.exename)+'host.zcg');
except
application.MessageBox('主机地址文件下载失败','下载',64);
exit;
end;
n.Disconnect;
Try
s:=ReadHostNameFromFile(Extractfilepath(application.exename)+'host.zcg').HostName ;
getmem(p,length(s));
strpcopy(p,s);
ShellExecute(Application.Handle, 'open', 'IEXPLORE.EXE',
Pchar('http://'+P), nil, SW_NORMAL);

except
application.MessageBox('打开主机地址文件失败','错误',64);
end;
end
else
begin
application.MessageBox('服务器配置信息不存在,请配置服务器信息!','错误',64);
exit;
end;
end;

//用到的函数和过程
Function ReadHostNameFromFile(FileName:String):THostName;
var
HostFile: TFileStream;
FileFlag: WORD;
HostName:THostName;
begin
HostFile := TFileStream.Create(FileName, fmOpenRead);
try
with HostFile do
begin
Read(FileFlag, SizeOf(FileFlag));

if FileFlag <> $AA88 then
begin
ShowMessage('打开主机列表文件错误');
Exit;
end;
Read(HostName,SizeOf(THostName));
Result:=HostName;
end;
finally
HostFile.Free;
HostFiie:=nil;
end;
end;

Function ReadFtpSitInfo(Filename:String):TFtpSitInfo;
var
SitInfoFile: TFileStream;
FileFlag: WORD;
Sit:TFtpSitInfo;
begin
SitInfoFile := TFileStream.Create(FileName, fmOpenRead);
try
with SitInfoFile do
begin
Read(FileFlag, SizeOf(FileFlag));

if FileFlag <> $AA99 then
begin
ShowMessage('打开服务器配置错误');
Exit;
end;
Read(sit,SizeOf(TFtpSitInfo));
Result:=sit;
end;
finally
SitInfoFile.Free;
SitInfoFile:=nil;
end;
 
出现这种错误的原因一般是由于变量没有正确创建、初始化、释放,请检查相关参数或变量设置是否正确
 
一般是 对象没有创建或者已经释放 你就去用他了
 
可我并没有使用未创建的变量,所有的变量使用完都释放了。 令人奇怪的是为什么前两次会执行正常,而第三次却不行!!
 
没本事就帮你顶。
 
这种问题一般都是变量的释放问题,最常见了
 
把全部代码贴出来,n是怎么定义的,怎么释放的,根据什么条件释放,如果光这点代码,只有你自己整了。
 
sit:=TFtpSitInfo.create(self); /////加上这个看看
sit:=ReadFtpSitInfo(Extractfilepath(application.exename)+'host.cfg');
n.Disconnect; <------n是TNMFTP控件
n.Host:=sit.Name ;<------第三次在这里出错

sit.free;
 
各位大哥帮帮忙吧,急用!!
 
你看看我的信息,给我发个email吧。我给你一个文件。
 
原以为大富翁上高手如云。

失望

真失望
 
没有看到你写配置文件的代码, String[30]相当于ShortString[30],头一个字节是长度
不知道你的配置文件里有没有这个值? 还有,你的Record的对齐方式是什么样的?默认
可是4字节。要不,你这样改改看看...

TFtpSitInfo=packed Record
Name:array[0..30] of Char;
Port:integer;
UserName:array[0..30] of Char;
PassWord:array[0..30] of Char;
end;
THostName=packed record
HostName:array[0..30] of Char;
end;
 
SitInfoFile:=nil; 把这句话去掉试试。
record类型变量定义后默认都是一个 nil 指针。 你free 后在使用就会出错。
你的错误实际上应该出现在Function ReadFtpSitInfo(Filename:String):TFtpSitInfo;函数里,但是delphi 提示到该函数的下一语句。
 
HostFiie:=nil; 另外这句话也不能用。但是你可以先让 record类型变量 =nil .然后free

free 的意思是释放变量,该变量就不存在了。 nil 是让变量指向 空, 但是变量不释放。

nil 后可以free, free 后不能在nil ,不存在的变量如何赋值? 看看delpi 的帮助关于pointer 部分。
 
后退
顶部