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

Project1

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

[已经解决] C++语言问题,ruby得到指针如何调用其对象的属性和方法

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
4 小时
注册时间
2011-10-16
帖子
81
跳转到指定楼层
1
发表于 2011-11-6 09:51:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
4 小时
注册时间
2011-10-16
帖子
81
4
 楼主| 发表于 2011-11-6 14:27:32 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
3
发表于 2011-11-6 12:38:32 | 只看该作者
你这个是 C++ 问题啊。Ruby 标准库中只提供了调用外部 C 函数的接口(dl、Win32API 这两个库),没有提供 C++ 的绑定,因为前者是跨编译器的,而后者的协议依赖于具体的 C++ 实现(MSVC?MinGW?GCC?TCC?Borland C++?)和平台。后者的绑定过程相对于 C 函数来说也比较复杂——当 C++ 类包含虚函数时,调用端需要自行访问虚表处理多态绑定;成员函数的 __thiscall 调用约定需要特殊处理;编译器特定的函数名称装饰也需要特殊处理。这些都不能通过默认的 dl 或是 Win32API 库来处理,RM 默认只有 Win32API,所以也不能处理。在一个自由的 Ruby 环境下,用户可以通过写 Ruby 扩展来自行建立一个可以绑定 C++ 类、函数的机制,但这个在(默认情况下)没有导出 Ruby API 的 RM 中无法实现。RM 中唯一可行的方案就是通过中间语言 C 做桥,在 C++ 层上另建一层 Ruby 可识别的 C 接口,然后再用 Win32API 调用。如果是静态绑定的 C++ 函数,那就可以只是简单的 wrapper,将 C++ 的接口协议改写为 C 的协议 [1];但一旦需要处理多态时,由于需要查询虚表查进行函数分派,即便实现了也是与特定版本的编译器绑在了一起,没有可移植性。这时最好是直接封装了你想要实现的功能,即实现一个高层接口。当然,你可以实现一个 C 接口调用 dynamic_cast 或者 typeid 在运行时判断动态类型,这个的效率自然比直接查询虚表低。

比如FrameFunc这是一个函数,这样在ruby中如何使用?

你可以在 RM 映射了导出 FrameFunc 这个函数的 DLL 之后调用 GetProcAddress 获取 FrameFunc 的地址,前提是 FrameFunc 确实被导出了。否则的话,你可以在 DLL 里建一个接口返回这个函数的地址,然后作为 32 位整数传给 Ruby。

[1] 比如,Klass::System_SetState(int, const char*) 这个成员函数的签名可以被改写为 System_SetState(Klass*, int, const char*),并按 C 函数 __stdcall 约定导出。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2011-11-5
帖子
9
2
发表于 2011-11-6 10:31:45 | 只看该作者
DLL还是做DLL该做的事比较好
既然已经有了源码那么可以修改DLL内容了吧?添加几个函数入口然后在Ruby里调用,hge作为指针传递
我妻由乃 その者、头脳明晰、容姿端丽にして、 ストーカー也

要是阿雪跟這女生關係好起來,說不定阿雪就會喜歡上她。一定要殺掉,絕不會讓任何人接近阿雪的,接近阿雪的傢伙都要殺掉!你們這群傢伙也想把阿雪從我身邊奪走是吧?
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 22:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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