PHCAR类型数据接收问题(折腾了好长时间弄不明白,很着急,请各位一定帮忙呀!) ( 积分: 100 )

  • 主题发起人 主题发起人 冷涯
  • 开始时间 开始时间

冷涯

Unregistered / Unconfirmed
GUEST, unregistred user!
问题描述如下:
我有一个DLL,里边有一个函数是这样声明的
function SetSaveIPfee(const IPfeebill:pchar; var flag:Integer):pchar; stdcall;
我在另一个程序中调用该DLL的函数,但结果老是读不出来,然后就报异常,是一个内存地址的访问错误,出错部分代码如下:
datainfo : Pchar;
ls_rtn : String;
try
// GetMem(datainfo,512);
datainfo := SetSaveIPfee(IPfeebill,aflag);
// Application.MessageBox(pchar(inttostr(StrLen(datainfo))),'');
ls_rtn := datainfo;//就是老在这一句报错
// FreeMem(datainfo);
If aflag >= 0 Then
ls_rtn := '';
except
on E:Exception Do
begin
ls_rtn := E.Message;
end;
end;
这部分代码是写在一个函数中实现的,在循环调用该函数时,要不就是1,3,5,7..次出错,要不就是2,4,6,8..次出错,这个基本上跟DLL的静态调用和动态调用方法有关.但我始终搞不明白的就是去年写的一些测试程序,不管是动态调用还是静态调用,代码一模一样,一点问题都没有.起初我怀疑可能是变量名字冲突,就是同一个变量名到处声名造成的内存地址不对劲儿,或者是PCHAR型变量的大小有限制等等,但试了N种办法就是解决不了,请大家帮我看看,我快急死了.
 
返回PChar类型,PChar是个指针,一般不会返回指针,因为函数SetSaveIPfee中经常返回局部变量,而函数调用完成后,局部变量已释放,你返回的指针已经没意义了。。。
一般要传递一个指针和指针指向区域的大小给SetSaveIPfee,函数中将值拷贝到指针指向的区域。。。
 
读函数结果时总是隔三差五地报:
'Access violation at address 004050D3 in module 'clietntestpro.exe'. Read of address 00C46AB4'
通过观察我发现函数
function SetSaveIPfee(const IPfeebill:pchar; var flag:Integer):pchar; stdcall;
的 flag 参数每次都有返回值,但取它自身的返回结果就有时会报这个异常.
请大家帮忙分析一下原因,我将不胜感激.
 
lake_cx 已经解释了啊
 
只能说这个DLL函数真TMD,不知道是谁声明、定义的,
常规应该是
function SetSaveIPfee(const IPfeebill:pchar; var flag:Integer; datainfo: pchar; datainfolen: integer): Boolean; stdcall;

这样试试吧

datainfo : Pchar;
ls_rtn : String;

try
datainfo := SetSaveIPfee(IPfeebill,aflag);
ls_rtn := StrPas(datainfo);//就是老在这一句报错
If aflag >= 0 Then
ls_rtn := '';
except
on E:Exception Do
begin
ls_rtn := E.Message;
end;
end;
 
多谢各位.
function SetSaveIPfee(const IPfeebill:pchar; var flag:Integer):pchar; stdcall;
如果在不改变此函数声明的前提下,能不能用什么办法在WINDOWS中强制分配一块儿内存,用来存放该函数返回值指针所指的内容呢?
能不能用象这样:
GetMem(p1,512);
p1 := pchar('OK');
strcopy(result,p1);
 
如果在不改变此函数声明的前提下,就算你强制分配一块儿内存,怎么传给这个函数用?

期待楼主发明一个这样的语言吧
 
如果楼主要是这样做,你就看看下面就可以了!

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3530241
 
多谢各位的帮助,尤其是KK2000提供的贴子,简直就是和我遇到的问题一模一样,看了之后受益匪浅,再次感谢!
 
后退
顶部