大问题,请高手解决(100分)

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

songmk

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序一切运行正常,但我一退出程序,就出现如下错误:
project demo.exe raised exception class EInvalidPointer with
message 'Invalid pointer operation'. Process stopped . Use step or run to continue

备注: 在此程序中我调用了一个DLL库

这是怎么回事儿?
 
DLL库都是由C语言写成,注意一下有关指针的操作,特别是字符指针的操作。

一般来说,字符串的內存分配都是由用户完成的。
 
应该是有一个指针分配内存后没有收回吧。
 
退出应用程序时一定要注意将创建的对象释放完,否则就会引起地址指针冲突,对于DLL,
运行完后也要进行卸载
 
delphi的指针不用释放,好像.
 
是谁说Delphi的指针不用释放?

只有小部分会自动释放外,所有由用户自己分配的指针都要释放。
 
估计是字符串的操作有问题,我再找找原因

如果等会儿我解决了,就把分大家分了吧

我这里面pchar和string搞得有点乱, 老是出现地址冲突
关于pchar 有啥忠告?
 
调用dll库的时候传递了PChar参数?
如果是的话,在主程序中,先把这个参数赋值给一个全局变量,然后
再把全局变量传给dll。这样会好些。
 
释放之后最好再把对象设成nil。
 
我的源程序如下:
unit IC_PK;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;


function Cardcomm(fd:integer;Len:integer;Commstr:string;var lenr:integer;resp:pchar):integer;
function CreateNewCard(fd:integer):string;

implementation

Function ICC_tsi_apiC(fd:integer;len:integer;comm:pchar;var lenr:integer;resp:pchar):integer;
stdcall;far;external 'crcwc.dll';

Function ICC_reset(fd:integer;var lenr:byte;resp:pchar):word; stdcall;far;external 'crwicc.dll';


function Cardcomm(fd:integer;Len:integer;Commstr:string;var lenr:integer;resp:pchar):integer;
var
ret:word;
begin

ret:=ICC_tsi_apiC(fd,len,Pchar(Commstr),lenr,resp);
Cardcomm:=ret;
end;



function CreateNewCard(fd:integer):string;
var
Comm,resp:pchar;
ret:word;
lent:byte;
tmpResp,MyRet:string;
lenr:integer;
begin
Getmem(comm,270);
Getmem(resp,256);
lenr:=0;
SetLength(tmpResp, 256);
SetLength(MyRet, 256);
Cardcomm(fd,7,'00A40000023F00',lenr,resp);
Cardcomm(fd,21,'00200001080000000000000000',lenr,resp);
Cardcomm(fd,5,'800e000000',lenr,resp);
ret:=ICC_reset(fd,lent,resp);
Cardcomm(fd,12,'80E00000073F0050FF00FFFF',lenr,resp);
Cardcomm(fd,18,'80D401010D3AF0020A330000000000000000',lenr,resp);
Cardcomm(fd,22,'80E01000113805E8f0f095FFFFA00000000386990701',lenr,resp);
Cardcomm(fd,7,'00a40000021000',lenr,resp);
Cardcomm(fd,12,'80E00000073F0100FF00FFFF',lenr,resp);
Cardcomm(fd,14,'80D40101093AF0020A3338383838',lenr,resp);
Cardcomm(fd,12,'80E00007073D0280F0F0FFFF',lenr,resp);
Cardcomm(fd,12,'80E00002073e0100F0F0FFFF',lenr,resp);
Cardcomm(fd,12,'80E00008072800FFF0F0FFFF',lenr,resp);
Cardcomm(fd,5,'80CE000700',lenr,resp);
while ret<>27904 do
ret:=Cardcomm(fd,5,'0000000000',lenr,resp);
Cardcomm(fd,5,'80CE000700',lenr,resp);
StrCopy(comm,'00d0820087');
StrCopy(comm+10,resp);
tmpResp:=string(resp);
Myret:=tmpResp;
Cardcomm(fd,280,comm,lenr,resp);
StrCopy(comm,'00D6880087');
StrCopy(comm+10,Pchar(tmpResp));
Cardcomm(fd,280,comm,lenr,resp);
// freemem(comm); //注意这里:如果不注释掉此行,则运行到这里产生访问地址冲突 ,如果注释掉则运行正常,返回结果也正确,但是就会出现以下错误:我一退出程序,就出现如下错误:
//project demo.exe raised exception class EInvalidPointer with
//message 'Invalid pointer operation'. Process stopped . Use step or run to continue


// freemem(resp);
CreateNewCard:=Myret;
end;
 
多人接受答案了。
 
后退
顶部