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获得我想要得数据,这是我哪边出错了呢?

------解决方案--------------------
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有可能用来接受字节数,所以可以推测到它的类型。