首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

PB9.0调用Delphi6.0编译的dll 结束程序报错有关问题!

2012-03-30 
PB9.0调用Delphi6.0编译的dll 结束程序报错问题!!由于工作需要,接手了一个同事用Delphi6.0写的通讯dll。但

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的初始化及释放部分

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);没有释放的,可能会引起这个问题。

希望能帮到你。

热点排行