谁能帮忙解决这个错误?(60分)

  • 主题发起人 主题发起人 sharewe
  • 开始时间 开始时间
S

sharewe

Unregistered / Unconfirmed
GUEST, unregistred user!
Project hrclient.exe raised exception class eOleException with message 'Access violation at address 0048BAC6 in module 'scktsrvr.exe' read of address 00000000' process stopped use step or run to continue
 
初始化、释放
 
create后未正确free的问题.
 
to newsmile,szmh
数据集开始打开OK,然后断开连接,我的服务器端此时改了数据库连接,再关闭此数据集的时候就会出这个问题
我其它的数据集未Free都可以的
 
同意newsmile的意见,大多数地址错误都是对象未创建或未释放。
 
at address 0048BAC6
通过它的MAP文件根据这个地址查一下出错的代码行,
 
你那是OLE错误,但又说发生在SCKTSRVR.EXE,你是通过这个程序做代理,编写的三层结构的东西,建议此时重新启动SCKTSRVR.EXE,如果问题仍在,你可以停止此程序,直接打开
"C:/Program Files/Borland/Delphi7/Source/Vcl/ScktSrvr.dpr"这个项目,运行它,设置断
点跟一下,这是那代理服务程序的源码.
 
来如风,不好意思请教一下,MAP文件如何查看,
wugwdelphi,谢谢,,我先试一下
 
to wugwdelphi
关闭了重启scktsrvr.exe还是一样的错误
另外就是在这期间并未对任何的组件进行释放,也就没有所谓的创建了,因为在系统运行的时候就都已创建好了,如果不切换服务端的数据源是不会有错的,一切正常,一切换就出错了,但其它的数据集又可以正常工作
 
你打开我说的那个项目,停掉你的SOCKSRVR,然后运行,你设个断点跟一下!
 
to wugwdelphi
此时报您的主机中已放弃了一个已建立的连接
感觉同一段代码第一次执行可以,第二次执行就不行了
 
把该停的程序全停了,再运行,最好重启一下应用服务器(防止wins服务中止),数据库服务器(防止仍有悬留事务),然后再打开那个工程,运行它,总之让整个环境回到正常.
socksrvr工程中用到了SOCKET API,自创建了WINDOWS服务,用到了接口及OLE ,估计在接口创建或者调用的这个单元中出错了.
 
to wugwdelphi,
过程一
procedure TMainForm.aCStateExecute(Sender: TObject);
begin
try
pApplySysData ;
DMSystem.scSystem.AppServer.ControlInterface(Date,44,Userinfo.sName) ;
with DMSystemdo
begin
scSystem.Close ;
scBasic.Close ;
scPerson.Close ;
scLogistics.Close ;
scCheck.Close ;
scPay.Close ;
scSystem.Open ;
scBasic.Open ;
scPerson.Open ;
scLogistics.Open ;
scCheck.Open ;
scPay.Open ;
end ;
pOpenSysData ;
if DMSystem.cdsUser.Locate('Name',Userinfo.sName,[loCaseInsensitive]) then
begin
pSetPromptLanguage ;
pSetAllCaption ;
pGetUserinfo(DMSystem.cdsUser,True) ;
pgSNavigation ;
pSetMenuItems ;
spMain.Visible:=Userinfo.isUNavig ;
XPStyle.Active:=Userinfo.isXPStyle ;
cbTools.Visible:=Locationinfo.bShowTools ;
spServer.Caption:=ifthen
(DMSystem.scSystem.Host<>'',DMSystem.scSystem.Host,DMSystem.scSystem.Address) ;
aSNavigation.Caption:=ifthen
(spMain.Visible,fGBvBig5('隐藏导航','Hide Navigation',1),fGBvBig5('显示导航','Show Navigation',1)) ;
aSTools.Caption:=ifthen
(cbTools.Visible,fGBvBig5('隐藏工具栏','Hide Tools',1),fGBvBig5('显示工具栏','Show Tools',1)) ;
pCreateInterface ;
end else
pLogin ;
except
end;
end;
过程二
procedure TMainForm.Button1Click(Sender: TObject);
begin
pApplySysData ;
DMSystem.scSystem.AppServer.ControlInterface(Date,44,Userinfo.sName) ;
with DMSystemdo
begin
scSystem.Close ;
scBasic.Close ;
scPerson.Close ;
scLogistics.Close ;
scCheck.Close ;
scPay.Close ;
end ;
end;
过程三
procedure TMainForm.Button2Click(Sender: TObject);
begin
with DMSystemdo
begin
scSystem.Open ;
scBasic.Open ;
scPerson.Open ;
scLogistics.Open ;
scCheck.Open ;
scPay.Open ;
end ;
pOpenSysData ;
if DMSystem.cdsUser.Locate('Name',Userinfo.sName,[loCaseInsensitive]) then
begin
pSetPromptLanguage ;
pSetAllCaption ;
pGetUserinfo(DMSystem.cdsUser,True) ;
pgSNavigation ;
pSetMenuItems ;
spMain.Visible:=Userinfo.isUNavig ;
XPStyle.Active:=Userinfo.isXPStyle ;
cbTools.Visible:=Locationinfo.bShowTools ;
spServer.Caption:=ifthen
(DMSystem.scSystem.Host<>'',DMSystem.scSystem.Host,DMSystem.scSystem.Address) ;
aSNavigation.Caption:=ifthen
(spMain.Visible,fGBvBig5('隐藏导航','Hide Navigation',1),fGBvBig5('显示导航','Show Navigation',1)) ;
aSTools.Caption:=ifthen
(cbTools.Visible,fGBvBig5('隐藏工具栏','Hide Tools',1),fGBvBig5('显示工具栏','Show Tools',1)) ;
pCreateInterface ;
end else
pLogin ;
end;
如果将过程一分解成过程二和三分开执行,先执行过程二再执行过程三,无论执行多少次都不报错,如果多次执行过程一则不行,为什么?是不是一断开就连那里有问题?
 
问题解决了,不过如果wugwdelphi,
有空,还是请你帮忙解释一下为什么^_^
 
如果是这样你仍可以试验一下:
1).把过程二、三分别写成过程,如proc1,proc2,
然后在同一段代码中前后调用,估计仍会报错。
2)仍是过程,只是点了button1后再点button2这样是不是不会报错??
 
如果是这样那么说明是数据通信,数据集的频繁打开,服务器在网络环境上不能象单机上那么快速的反应造成socksrvr中间传输时不能及时同步,其是多线程通信的,你可以研究一下它的同步处理,如果一定要用可以在PROC1,PROC2之前加入sleep(200)来解决。
 
之间不是之前:)
 

Similar threads

I
回复
0
查看
974
import
I
I
回复
0
查看
589
import
I
I
回复
0
查看
948
import
I
I
回复
0
查看
773
import
I
后退
顶部