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获得我想要得数据,这是我哪边出错了呢?
------解决方案--------------------
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;
再试试
------解决方案--------------------
确实没法判断,这是C++灵活性的负面代价,这就体现了文档的重要性,你看看Windows API,这样的情况不少见,但是文档说得很清楚,通常不会造成误会。
另外从函数功能上也能得出些线索,比如,这个函数会填充你的接受缓冲区,但是填充多少个字节,一定需要一个返回参数告诉调用者,参数里面只有rlen有可能用来接受字节数,所以可以推测到它的类型。