函数调用问题(请老鸟进来)

wuelbh 2008-03-07 09:08:39
最近碰到奇怪一个问题,现在请教各位老鸟.
情况描述如下:
1 函数A:DLL调用声明.
2 函数B:调用A的函数.(非常简单)
3 函数C:一个循环调用.

伪代码如下:
procedure A(a:string);Dll

procedure B(a:string);
begin
A(a:string)
end;

procedure C;
begin
for i := 1 to max do
begin
B('a');
end;
end;

如果调用方法如上:C-->B-->A,就会不定时出现错误.
如果是C-->A,就会一直正常.
如果是多线程中C-->B-->A,也会一直正常.

想问一下出现这种问题的根本原因和机制.谢谢
...全文
151 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZuoBaoquan 2008-03-17
  • 打赏
  • 举报
回复
楼主跟踪汇编代码吧,有些时候代码是假象
wuelbh 2008-03-13
  • 打赏
  • 举报
回复
DDL里确定是stdcall协定,出现这样的问题非常奇怪.
PS:
如果我加入sDate1 := now; ,或者sDate2 := now;
但运行完sDate1 := now; 之后运行 hac34AddCard(参数) 就会出现不从Dll函数中出来,死在这里.
如果不执行 sDate1 := now; 直接执行 hac34AddCard(参数) 就一直正常
楚人无衣 2008-03-07
  • 打赏
  • 举报
回复
用PAnsiChar传参数试下,导出不忘用stdcall协议
ysai 2008-03-07
  • 打赏
  • 举报
回复
DLL中的函数就不要用string了,内存管理会有问题
Harryfin 2008-03-07
  • 打赏
  • 举报
回复
hac34AddCard这个函数在DLL里面的调用协定是不是确定也是stdcall?调用协定不一样,参数就会出很多怪问题。
wuelbh 2008-03-07
  • 打赏
  • 举报
回复
经过测试,动态调用问题依然存在
hsmserver 2008-03-07
  • 打赏
  • 举报
回复
动态调用试试
wuelbh 2008-03-07
  • 打赏
  • 举报
回复
上面的DLL太长,弄一下方面大家看
DLL声明是这样的:
function hac34AddCard (iNodeID:integer; cCardNo:pchar; iCardLen:integer; cPassWord:pchar;
iPassLen:integer; iTimeZone:integer; cStatus:char; hCom:Integer;
iTimeout:Word):integer;Stdcall;external 'RAC2000.DLL';
wuelbh 2008-03-07
  • 打赏
  • 举报
回复
可能说得不是很清楚
上面写的是伪代码.

DLL声明是这样的:
function hac34AddCard (iNodeID:integer; cCardNo:pchar; iCardLen:integer; cPassWord:pchar; iPassLen:integer; iTimeZone:integer; cStatus:char; hCom:Integer; iTimeout:Word):integer;Stdcall;external 'RAC2000.DLL';

不存在楼上两位朋友的问题.

今天早上再测试和研究.发现更怪.
函数B中如下:

procedure B(参数);
var
sDate1,sDate2 : TDateTime;
begin
sDate1 := now;
A(参数);
sDate2 := now;
end;

如果我加入sDate1 := now; ,或者sDate2 := now;.就会出错.
并不如我原来所说的

如果调用方法如上:C--> B--> A,就会不定时出现错误.
如果是C--> A,就会一直正常.
如果是多线程中C--> B--> A,也会一直正常.

的情况.

PS:抱歉,没研究清楚就传上来.但现在这个问题是什么原因呢???sDate1,sDate2不传到函数A中.



5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧