设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4449|回复: 13
打印 上一主题 下一主题

[已经过期] Win32API.new的参数类型为浮点数或长整数时用什么符号表示?

[复制链接]

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
跳转到指定楼层
1
发表于 2014-6-29 12:57:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
百度上搜索到 参数3 字符串数组 表示每个参数的类型 L代表Long P代表Point I代表Int V代表Void (在实际使用的时候HResult和各种Handle都是Long,字符串是P)

但却没浮点数或长整数时用什么符号表示
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39860
在线时间
7493 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

14
发表于 2014-6-29 16:44:47 | 只看该作者
流川枫 发表于 2014-6-29 16:29
不过这样是建立在那个API是传递指针,如果必须调用 如 ULONGLONG WINAPI GetTickCount64(void); 这个API ...


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

不兼容32位寄存器的类型本身是不支持的,你必须通过第三方dll二次调用。(浮点不支持可能是缺陷吧。)
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
13
 楼主| 发表于 2014-6-29 16:29:35 | 只看该作者
fux2 发表于 2014-6-29 16:24
pdouble传给dll,dll里用浮点数指针来玩就可以。

不过这样是建立在那个API是传递指针,如果必须调用 如 ULONGLONG WINAPI GetTickCount64(void); 这个API,用pack也没用吧。 还是说RUBY本身就是不支持 GetTickCount64 这个API的调用吗?
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39860
在线时间
7493 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

12
发表于 2014-6-29 16:24:20 | 只看该作者
流川枫 发表于 2014-6-29 16:14
比起纸上谈兵不如给个范例代码吧
  1. double = 3.14159265358 # 测试用浮点数
  2. pdouble = [double].pack("d") # 取得以double形式序列化的double变量的指针
复制代码
pdouble传给dll,dll里用浮点数指针来玩就可以。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
11
 楼主| 发表于 2014-6-29 16:14:55 | 只看该作者
fux2 发表于 2014-6-29 15:53
所以我叫你pack一下啊。dll里取址就行。
你硬要直接传过去默认是不支持的。  ...

比起纸上谈兵不如给个范例代码吧
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39860
在线时间
7493 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

10
发表于 2014-6-29 15:53:49 | 只看该作者
流川枫 发表于 2014-6-29 15:21
@fux2
你看一下汇编


所以我叫你pack一下啊。dll里取址就行。
你硬要直接传过去默认是不支持的。

点评

那个pack是做什么用的我还不清楚,写个例子吧  发表于 2014-6-29 16:17
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
9
 楼主| 发表于 2014-6-29 15:21:17 | 只看该作者
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不匹配,会导致堆栈损坏。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39860
在线时间
7493 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

8
发表于 2014-6-29 14:43:06 | 只看该作者
流川枫 发表于 2014-6-29 13:32
对于double和longlong的返回值是存储在eax和edx寄存器,也就是说返回值不是指针而是在寄存器里。用"p"将 ...

那pack一下就好,依旧以指针传过去。

点评

只有参数是传递指针的形式才能够用"p",也就是说如果参数是直接double,汇编将push两次将64位的变量压入堆栈。返回值则是将高位mov到edx,低位到eax。   发表于 2014-6-29 15:10
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
7
 楼主| 发表于 2014-6-29 13:32:58 | 只看该作者
fux2 发表于 2014-6-29 13:25
浮点数是指针,p

对于double和longlong的返回值是存储在eax和edx寄存器,也就是说返回值不是指针而是在寄存器里。用"p"将导致内存访问违规。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
6
发表于 2014-6-29 13:31:54 | 只看该作者

点评

“*请注意虽然pack能处理32位和64位浮点数,但Win32API不能,还是只能用pack做中介” 这里所谓的pack是什么?  发表于 2014-6-29 13:36
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-12 07:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表