关于调用动态库出现的问题,恳请帮忙分析(50分)

  • 主题发起人 主题发起人 qyfei
  • 开始时间 开始时间
Q

qyfei

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi调用C的动态库,目前我只有其中两个函数的原型
一个是函数A,另一个是函数B,B的原型为:bool GetNextK(int MachNo,char *Result)
我在Delphi声明函数B:function GetNextK(MachNo:Integer;_Result:PChar) :Boolean;stdcall external 'ic_dll.dll';

我运行程序后,出现这样的现象:
我先调用函数A是成功的,然后我调用函数B也是成功的,但是再调用函数A就失败了,再调用函数B也是失败的。
意思是只要函数B使用过一次之后,再调用其他函数都不能成功,遇到这种情况,我把程序关闭了重新运行,现象仍然一样,B使用了之后,其他就不能使用。

请问会是什么原因造成的,我换成了动态调用,好像也是一样的结果,烦请各位帮忙分析,多谢,提供点方法让我来测试,解决这个问题。
 
B有问题,使用后资源未能完全释放,估计
 
逆向分析 + 汇编调试
 
我也怀疑是使用B函数出了问题,但是现在我不可能去分析动态库有什么问题,我没有动态库的代码,而且我估计动态库没什么问题,关键是在使用函数B的时候可能有什么要注意的。
上面朋友,能详细讲一下:逆向分析 + 汇编调试 ,这个难度太大了吧,呵呵。
还有什么好的方法可以让我试一试,比方说我的声明function GetNextK(MachNo:Integer;_Result:PChar) :Boolean;stdcall external 'ic_dll.dll';
其中的这个Pchar参数,我传的时候是个临时变量传的,是不是要换成全局试一下,等等。
 
是否你的PChar类型的数据造成的,比如申请了内存空间,用完未释放什么的
不知道你的程序咋写的,呵呵
 
我是这样用的,假设我点击button事件下调用函数B,
我声明了变量
var
returnPchar:Pchar;
state:boolean;
begin
//先分配空间,
GetMem(returnPchar,22);
//然后调用
state:=GetNextK(machineno,returnPchar);
//最后释放
FreeMem(returnPchar);
end;
大体就是这样的过程用的。
 
看不出问题啊
调用完了一次,再调不成功
不成功是个什么概念?报错不?
看是否可以捕捉到异常什么的呢?
 
看你这个是个做什么的动态库,如果是硬件驱动之类的,这个就太正常了,是因为硬件的相关控制没有复位或是调用的步骤不对等所引起的
 
回DIGUA及HJ.Yao:
我的这个测试程序是通过串口连接硬件的,这两个函数也都是对硬件的操作,具体操作由动态库实现,我只是调用。
不成功的意思就是:我先调用函数A,动态库返回成功,然后使用函数B,动态库也返回成功,但是一旦B使用过一次后,在用函数A或者B,动态库就一直返回失败了。
动态库提供了很多函数,我仔细看了一下,没有什么相关的复位的函数,也没有相关步骤的介绍,从这两个函数的作用来看,应该不存在调用顺序问题。
 
连接串口的,那是否可能是因为你调用B后,把串口数据全部接收了,再次调用时无新的数据,所以造成你觉得未成功?
连了硬件,问题就不一定了,最好有那个DLL的详细说明
 
应该不是,
函数A的作用是读取考勤记录数量;
函数B的作用是读取实际的考勤记录;
这两个函数的返回值都是布尔型的,所以函数执行是不是成功的很清楚,应该无论什么时候读取考勤记录数量或者读取考勤记录,都没有顺序要求,都应该成功,即使没有考勤记录了也是该返回成功。
 
多人接受答案了。
 
后退
顶部