关于网友提出的“ delphi调用c写的动态库,怎么调用这个函数,谢谢”问题疑问,本网通过在网上对“ delphi调用c写的动态库,怎么调用这个函数,谢谢”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: delphi调用c写的动态库,怎么调用这个函数,谢谢
描述: 原来的声明是
__int16 __stdcall command(HANDLE idComDev,unsigned char slen,
unsigned char * sendbuffer,unsigned char *rlen,
unsigned char * databuffer,unsigned char timeout,
unsigned char FG);
我这样用
Function command(ICDev: longint; slen: smallint; sendbuffer, rlen, databuffer: pchar; timeout,
FG: smallint): smallint; stdcall;
far; external 'aaa.dll' name 'command';
程序中应用:
var
StrAPDU:string;
rlen, rbuff: pchar;
st: smallint;
icdev: longint;
begin
Try
Getmem(rbuff, 255);
Getmem(rlen, 255);
......
st := command(icdev, length(StrAPDU) Div 2, pchar(StrAPDU), rlen, rbuff, 7, 40);
Finally
freemem(rlen);
freemem(rbuff);
End;
但是我总是不能在rbuff获得我想要得数据,这是我哪边出错了呢?
解决方案1: 确实没法判断,这是C++灵活性的负面代价,这就体现了文档的重要性,你看看Windows API,这样的情况不少见,但是文档说得很清楚,通常不会造成误会。
另外从函数功能上也能得出些线索,比如,这个函数会填充你的接受缓冲区,但是填充多少个字节,一定需要一个返回参数告诉调用者,参数里面只有rlen有可能用来接受字节数,所以可以推测到它的类型。
解决方案2: unsigned char对应的Delphi类形是Byte,另外我推测:rlen是指Recieved Len,所以应当是个指向缓冲度长度值的指针,而不是一个缓冲区指针,所以请LZ将函数声明改为:
Function command(ICDev: longint; slen: byte; sendbuffer:pchar;var rlen: byte; databuffer: pchar; timeout, FG: byte): smallint; stdcall; far; external 'aaa.dll' name 'command';
过程改为:
var
StrAPDU:string;
rlen:byte; //change declare
rbuff: pchar;
st: smallint;
icdev: longint;
begin
Try
Getmem(rbuff, 255);
// Getmem(rlen, 255);
......
st := command(icdev, length(StrAPDU) Div 2, pchar(StrAPDU), rlen, rbuff, 7, 40);
Finally
// freemem(rlen);
freemem(rbuff);
End;
再试试
以上介绍了“ delphi调用c写的动态库,怎么调用这个函数,谢谢”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3582637.html