Delphi调用Dll返回结构体的问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi调用Dll返回结构体的问题?相关的知识,希望对你有一定的参考价值。

C写的一个动态库,其中有些函数的返回值为结构体(非指针),然后在Delphi里调用,得到的返回结果是错误的。
例如,在C里面:
结构体:
typedef struct uv_buf_t
ULONG len;
char* base;
uv_buf_t;
导出的函数:
uv_buf_t uv_buf_init(char* base, unsigned int len)
uv_buf_t buf;
buf.base = base;
buf.len = len;
return buf;

在Delphi里:
对应C的结构体:
uv_buf_t = record
len: ULONG;
base: PAnsiChar;
end;
函数声明为:
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;
在Delphi中调用:
procedure test2;
var
buf: uv_buf_t;
s: PAnsiChar;
begin
s := 'abcde';
buf := uv_buf_init(@s, 5);
Writeln('buf的值:len=' + IntToStr(buf.len) + ' base=' + buf.base);
end;
最终的结果是错误的,而且会导致传到C中的参数的值也不对,如果把C库中函数的返回值和Delph声明函数的返回值都改为指针就一点问题都没有,但是我们是不能动C代码的,只能接收返回的结构体,不知哪位高手有解决办法或思路,在此先谢过了。
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t; cdecl;
调用约定都试过了,还是不行。

那就看你的结构体和传参是否正确了,你光这样瞎说,没人看的出问题。起码关键代码和大致错误贴出来. 参考技术A uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;stdcall;

追问

调用约定都试过了,还是不行。这个也试过了的,不行。

追答buf^ := uv_buf_init(@s, 5);  //试试

追问

这样也不行的。

追答//定义
uv_buf_t = record
    len: ULONG;
    base: PAnsiChar;
  end;
puv_buf_t= ^uv_buf_t;  

//函数
var ppi:puv_buf_t
begin
   ppi :=allocmem(sizeof(uv_buf_t));
   ....
   ....
   ....
end;

本回答被提问者和网友采纳

函数可以返回结构体的原因

 C 语言中函数返回结构体时如果结构体较大, 则在调用函数中产生该结构的临时变量,并将该变量首地址传递给被调用函数,被调用函数返回时根据该地址修改此临时变量的内容,之后在调用函数中再将该变量复制给用户定义的变量,这也正是 C 语言中所谓值传递的工作方式。
    如果结构体较小, 则函数返回时所用的临时变量可保存在寄存器中,返回后将寄存器的值复制给用户定义的变量即可。

 

http://blog.csdn.net/guoqianqian5812/article/details/46708177

以上是关于Delphi调用Dll返回结构体的问题?的主要内容,如果未能解决你的问题,请参考以下文章

c#调用Delphi DLL参数为结构体数组

C#调用delphi记录结构体问题

深入delphi编程理解之消息发送消息函数及消息编号消息结构体的理解

函数可以返回结构体的原因

C#调用C++的dll库怎么传递结构体中不定长度的char数组

Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.