您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> delphi调用c写的动态库,怎么调用这个函数,谢谢

delphi调用c写的动态库,怎么调用这个函数,谢谢

来源:网络整理     时间:2016/8/25 2:59:09     关键词:

关于网友提出的“ 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

相关图片

相关文章