PB9.0调用Delphi6.0编译的dll 结束程序报错问题!!
由于工作需要,接手了一个同事用Delphi6.0写的通讯dll。但是这个dll在pb9.0调用后,正常运行,结束程序后会报如下错误。
PB90.EXE - 应用程序错误
“0x00000000”指令引用的“0x00000000”内存。该内存不能为“read”。
pb程序不调用dll,没有报错。所以我怀疑dll的问题大点,但是我对Delphi编译dll不是很熟悉,不清楚针对com口dll的处理哪里有问题,麻烦各位xdjm帮忙看看。可能是哪的问题?
以下贴出dll对com的初始化及释放部分
{----------------------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;{------------------------------}