奇怪?为什么在子函数内使用就不行 (200分)

  • 主题发起人 zhanshenzzz
  • 开始时间
Z

zhanshenzzz

Unregistered / Unconfirmed
GUEST, unregistred user!
与其他公司程序进行通讯的程序:
Fssj(接受数据),Fssj(发送数据)为外公司用VC++作的dll函数;
本程序为一个dll,由外公司的执行程序A.exe调用;
用SendData2函数,A.exe调用几次后A.exe会退出;
调试状态下:会停在A.exe内部,错误代码记不太清了:似乎是读写地址错(改一次本程序地址变一次)(溢出?)
注意:以下2行
// ret := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);//成功
// ret := SendData2();//不成功(几次成功后)
注意end

//以下为代码

function TTjhApp.DealData(Dealv1, Dealv2: Pchar): Integer;
var
MyDsf : TDsf;
Myaddr : array [0..10] of char;
Myfilename : array [0..240] of char;
ret: integer;
function SendData2():integer;// stdcall;
begin
result := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);
end;
begin
fillmemory(@Mydsf,sizeof(Mydsf),0);
fillmemory(@Myaddr,sizeof(Myaddr),0);
strcopy(Myfilename,'aa');
ret := 0;
ret := Jssj(Dealv1, Dealv2,@myaddr,@Mydsf,@Myfilename);
if ret <> 1000 then
begin
result := -1;
exit;
end;
// ret := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);//成功
ret := SendData2();//不成功(几次后)
exit;
end;
 
这个和Delphi底编译机制有关系(堆变量分配溢出),换为全局过程即100%可以!
var
MyDsf : TDsf;
Myaddr : array [0..10] of char;
function SendData2():integer;
begin
result := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);
end;

function TTjhApp.DealData(Dealv1, Dealv2: Pchar): Integer;
var
Myfilename : array [0..240] of char;
ret: integer;
begin
fillmemory(@Mydsf,sizeof(Mydsf),0);
fillmemory(@Myaddr,sizeof(Myaddr),0);
strcopy(Myfilename,'aa');
ret := 0;
ret := Jssj(Dealv1, Dealv2,@myaddr,@Mydsf,@Myfilename);
if ret <> 1000 then
begin
result := -1;
exit;
end;
result:= SendData2();//几次后都成功也!
end;
 
下面成吗?
function SendData2(Dealv1, Dealv2,myaddr,Mydsf: pchar):integer;
begin
result := Fssj(Dealv1, Dealv2,myaddr,Mydsf,nil);
end;

function TTjhApp.DealData(Dealv1, Dealv2: Pchar): Integer;
var
MyDsf : TDsf;
Myaddr : array [0..10] of char;
Myfilename : array [0..240] of char;
ret: integer;
begin
fillmemory(@Mydsf,sizeof(Mydsf),0);
fillmemory(@Myaddr,sizeof(Myaddr),0);
strcopy(Myfilename,'aa');
ret := 0;
ret := Jssj(Dealv1, Dealv2,@myaddr,@Mydsf,@Myfilename);
if ret <> 1000 then
begin
result := -1;
exit;
end;
result:= SendData2(Dealv1, Dealv2,@myaddr,@Mydsf);//成吗?
end;
 
老大,这是不是delphi的bug?
 
你的定义
MyDsf : TDsf;
Myaddr : array [0..10] of char;
就是堆分配变量!

我不是告诉你要用全局变量了吗?难道你底程序一定要用过程内部函数才能实现么???
 
MyDsf : TDsf;
Myaddr : array [0..10] of char;
就是堆分配变量!??

那我认为正常的用法实际上也有问题了?
// ret := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);//成功

 
兄弟:
你的function SendData2():integer;是堆分配啊!
我又没有说Fssj()是堆分配啊!
 
ID:1774348 中是指
我用到了... ??
function TTjhApp.DealData(Dealv1, Dealv2: Pchar): Integer;
var
MyDsf : TDsf;
Myaddr : array [0..10] of char;
...
begin
...
ret := Fssj(Dealv1, Dealv2,@myaddr,@Mydsf,nil);//成功
...
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部