Project1

标题: Win32API.new的参数类型为浮点数或长整数时用什么符号表示? [打印本页]

作者: 流川枫    时间: 2014-6-29 12:57
标题: Win32API.new的参数类型为浮点数或长整数时用什么符号表示?
百度上搜索到 参数3 字符串数组 表示每个参数的类型 L代表Long P代表Point I代表Int V代表Void (在实际使用的时候HResult和各种Handle都是Long,字符串是P)

但却没浮点数或长整数时用什么符号表示
作者: 余烬之中    时间: 2014-6-29 13:05
反正在下一直是ipipipip…………
作者: 流川枫    时间: 2014-6-29 13:18
克莉丝 发表于 2014-6-29 13:08
又需要用这两种数据类型的api么

有,比如ULONGLONG WINAPI GetTickCount64(void);,不过我现在需要调用的API返回的是double
作者: fux2    时间: 2014-6-29 13:25
浮点数是指针,p
作者: 无脑之人    时间: 2014-6-29 13:31
http://rpg.blue/thread-256846-1-1.html
作者: 流川枫    时间: 2014-6-29 13:32
fux2 发表于 2014-6-29 13:25
浮点数是指针,p

对于double和longlong的返回值是存储在eax和edx寄存器,也就是说返回值不是指针而是在寄存器里。用"p"将导致内存访问违规。
作者: fux2    时间: 2014-6-29 14:43
流川枫 发表于 2014-6-29 13:32
对于double和longlong的返回值是存储在eax和edx寄存器,也就是说返回值不是指针而是在寄存器里。用"p"将 ...

那pack一下就好,依旧以指针传过去。
作者: 流川枫    时间: 2014-6-29 15:21
fux2 发表于 2014-6-29 14:43
那pack一下就好,依旧以指针传过去。

@fux2
你看一下汇编

push edx
push eax
call test
-----
//test(double){}
retn 8

上面就是一个什么都不做的浮点参数的函数调用。

如果用"p"
那么就会变成
push eax
call test
这样在返回时retn 8和参数的参数大小4不匹配,会导致堆栈损坏。
作者: fux2    时间: 2014-6-29 15:53
流川枫 发表于 2014-6-29 15:21
@fux2
你看一下汇编


所以我叫你pack一下啊。dll里取址就行。
你硬要直接传过去默认是不支持的。
作者: 流川枫    时间: 2014-6-29 16:14
fux2 发表于 2014-6-29 15:53
所以我叫你pack一下啊。dll里取址就行。
你硬要直接传过去默认是不支持的。  ...

比起纸上谈兵不如给个范例代码吧
作者: fux2    时间: 2014-6-29 16:24
流川枫 发表于 2014-6-29 16:14
比起纸上谈兵不如给个范例代码吧
  1. double = 3.14159265358 # 测试用浮点数
  2. pdouble = [double].pack("d") # 取得以double形式序列化的double变量的指针
复制代码
pdouble传给dll,dll里用浮点数指针来玩就可以。
作者: 流川枫    时间: 2014-6-29 16:29
fux2 发表于 2014-6-29 16:24
pdouble传给dll,dll里用浮点数指针来玩就可以。

不过这样是建立在那个API是传递指针,如果必须调用 如 ULONGLONG WINAPI GetTickCount64(void); 这个API,用pack也没用吧。 还是说RUBY本身就是不支持 GetTickCount64 这个API的调用吗?
作者: fux2    时间: 2014-6-29 16:44
流川枫 发表于 2014-6-29 16:29
不过这样是建立在那个API是传递指针,如果必须调用 如 ULONGLONG WINAPI GetTickCount64(void); 这个API ...


评论和回复写一起把,每次收到好几个提醒真蛋疼。

不兼容32位寄存器的类型本身是不支持的,你必须通过第三方dll二次调用。(浮点不支持可能是缺陷吧。)





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1