解决方案 »
- 如何用fastreport实现一页打印两列数据?
- dll调用的时候提示类没有注册
- 初来乍到,各位朋友帮帮我!
- 如何取的一个指定日期的前一天和后一天的日期?有这样的函数吗?
- 那位是武林高手,关于病毒的问题!!
- 应用程序之间如何实现参数传递
- 在rave5.0中怎么样实现横的,竖的同时打印 200分求教
- 关于写WORD的问题!
- 我靠据说是CIH病毒1.4版本的源代码.还有中文注释.大家一起来研究研究吧. (接上半部)
- 普通喷墨打印机能不能打印发票大小的纸张?
- 求助!StringGrid控件的OnColumnMoved怎么用?
- 【求助】使用mscomm控件,如果系统有2个以上的可用串口,如何判断当前自己的应用程序占用的是哪个串口?
所以,对应的delphi record,你试试加上 packed
如果返回的结构体是8字节就有问题,如果不是8字节就没有问题(比如删除或添加一个成员,或修改原有成员的类型)。现在看来,是Delphi和C在这方面的处理方式不同,从压栈的数据来看,返回值的地址会被压在栈顶,在C里面却把栈顶当做第一个参数,而不当作返回值,举个例子:
Delphi:
procedure test2;
var
buf: uv_buf_t;
s: PAnsiChar;
begin
s := 'abcde'+#0;
Writeln('uv_buf_t大小:' + IntToStr(Sizeof(uv_buf_t)));
Writeln('s的地址:' + IntToHex(Integer(@s), 8));
Writeln('buf的地址:' + IntToHex(Integer(@buf), 8)); buf := uv_buf_init(s, 5); Writeln('buf的值:len=' + IntToStr(buf.len) + ' base=' + buf.base);
end;那么在C里跟踪调试,运行结果如下:
按照从右到左的压栈顺序,先压右边的参数,如下的顺序:
0x0012FF00 40 ff 12 00 @... 这是返回值的地址
0x0012FF04 b4 9d 41 00 ??A. 这是参数base的值
0x0012FF08 05 00 00 00 .... 这是参数len的值
问题就在这里了,现在base指向了0x0012FF00 地址,即指向了返回值所在的栈,而len指向base数据存放的栈,即0x0012FF04,整好偏移了4个字节。不知道这是什么原因。
还有windows下C函数用stdcall调用模式的也很多。
uv_buf_init: procedure(base: PAnsiChar; len: Cardinal; var p: uv_buf_t); cdecl;
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uint64; cdecl;
然后:
PUInt64(@buf)^ := uv_buf_init(s, 5);