由于工作需要,接手了一个同事用Delphi6.0写的通讯dll。但是这个dll在pb9.0调用后,正常运行,结束程序后会报如下错误。
PB90.EXE - 应用程序错误
“0x00000000”指令引用的“0x00000000”内存。该内存不能为“read”。
pb程序不调用dll,没有报错。所以我怀疑dll的问题大点,但是我对Delphi编译dll不是很熟悉,不清楚针对com口dll的处理哪里有问题,麻烦各位xdjm帮忙看看。可能是哪的问题?
以下贴出dll对com的初始化及释放部分
- Delphi(Pascal) code
{----------------------com口初始化--------------------------------}//com口初始化;返回值=0成功 、=1失败function InitCom(const comid:string):integer;begin //关闭com口 if ComHandle <> 0 then CloseHandle(ComHandle); ComHandle:=createFile(pchar(comid), //串口名 generic_read or Generic_write,//访问模式 0, //共享模式,必须为0 nil, //安全属性指针 open_existing, ///找开方式必须为open_existing File_Flag_WRITE_THROUGH,//文件属性,操作系统不得推迟对文件的写操作 0); if ComHandle = invalid_Handle_Value then //同步方式判断串口大开是否成功 begin showmessage(comid+'打开失败'); //关闭com口 if ComHandle <> 0 then CloseHandle(ComHandle); result := 1; exit; end; //设置缓冲区大小 SetupComm(ComHandle,1024,1024); //设置串口的配置信息 GetCommState(ComHandle,dcb); dcb.BaudRate := 19200; //传输速率 dcb.ByteSize := 8; //使用的数据位数 dcb.Parity := SPACEPARITY; //奇偶校验方法,MARKPARITY:标号校验;SPACEPARITY:空格校验 dcb.StopBits := ONESTOPBIT; // 停止位数,ONESTOPBIT:1位停止位;ONE5STOPBITS:1.5位停止位;TWOSTOPBITS:2位停止位 if not SetCommState(ComHandle,dcb) then begin //关闭com口 if ComHandle <> 0 then CloseHandle(ComHandle); result := 1; exit; end; PurgeComm(ComHandle,(PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR)); //设置串口的超时时间 GetCommTimeouts(ComHandle,CommTimeouts); CommTimeouts.ReadIntervalTimeout := 100; CommTimeouts.ReadTotalTimeoutMultiplier := 50; CommTimeouts.ReadTotalTimeoutConstant := 500; CommTimeouts.WriteTotalTimeoutMultiplier := 50; CommTimeouts.WriteTotalTimeoutConstant := 500; SetCommTimeOuts(ComHandle,CommTimeouts); result:=0;end;{------------------------------}{------------------------初始化DLL---------------------------------}//初始化变量=0成功;=1失败 超时时间function Init(const CDT:integer):integer;begin CallDelayTime:=CDT; result:=0;end;{------------------------------}{------------------------释放DLL---------------------------------}//释放对象 =0成功;=1失败 function UnInit:integer;stdcall;begin //关闭com口 if ComHandle <> 0 then CloseHandle(ComHandle); result:=0;end;{------------------------------}
------解决方案--------------------
你把你调用DLL 的语句贴出来看看,包括申明DLL函数
------解决方案--------------------
我也有这个问题....等待解决中....
------解决方案--------------------
写出你的调用程序看看,大多数是变量定义错误引起的,定义时要严格安装dll的定义。
------解决方案--------------------
rtn = InitCom(s_comid)
中的s_comid要指定长度
比如
s_comid = space(1000)
------解决方案--------------------
一般来说,这种问题是DLL占用的资源没有释放引起的。
一个好的dll应该提供释放资源的方法调用。
如果是你自己写的dll,那么请检查是否释放资源。
如果是使用别人的dll,那么请检查是否有释放资源的方法而你没有调用。
------解决方案--------------------
Delphi不懂,不过这些自己变量应该不是问题所在,一般来说,有两种可能
1、VC中new了,或者注册了内存、指针,没有释放的,可能引起问题;
2、申请了系统资源,例如初始化COM口的代码,例如InitCom(xx,xx);没有释放的,可能会引起这个问题。
希望能帮到你。