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

xiaojinyulyh 2007-08-01 06:27:25
原来的声明是
__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获得我想要得数据,这是我哪边出错了呢?
...全文
88 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojinyulyh 2007-08-02
  • 打赏
  • 举报
回复
可是unsigned char *rlen, unsigned char * databuffer 这两个在原来的函数中不是一样吗?要是写动态库的程序员没有把参数名字起好,我们用的时候怎么判断哪些是用byte,哪些是要用pchar?
小风哥哥 2007-08-02
  • 打赏
  • 举报
回复
接分,没分了
rodgerkong 2007-08-02
  • 打赏
  • 举报
回复
确实没法判断,这是C++灵活性的负面代价,这就体现了文档的重要性,你看看Windows API,这样的情况不少见,但是文档说得很清楚,通常不会造成误会。
另外从函数功能上也能得出些线索,比如,这个函数会填充你的接受缓冲区,但是填充多少个字节,一定需要一个返回参数告诉调用者,参数里面只有rlen有可能用来接受字节数,所以可以推测到它的类型。
rodgerkong 2007-08-01
  • 打赏
  • 举报
回复
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;
再试试

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧