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

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; cdecl;
在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; stdcall;
调用约定都试过了,还是不行。 
------解决思路----------------------
调试,看cpu窗口
------解决思路----------------------
随C(++)编译器 版本不同,struct 可能是字节对齐的,也可能没有对齐(也可能在“项目”中设置)
所以,对应的delphi record,你试试加上 packed 
------解决思路----------------------
编译优化时delphi会根据结构的大小把返回值放到堆栈或是寄存器里,可能8字节就刚好放到寄存器里了(DX:AX)。
还有windows下C函数用stdcall调用模式的也很多。
------解决思路----------------------
你把C代码用bcc编译再试试。

------解决思路----------------------
你也可以这样声明试试:
uv_buf_init: procedure(base: PAnsiChar; len: Cardinal; var p: uv_buf_t); cdecl;

------解决思路----------------------
既然你确定了结构体是通过edx:eax返回的,那就可以在Delphi中返回int64/uint64:
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uint64; cdecl;
然后:
PUInt64(@buf)^ := uv_buf_init(s, 5);