赞 | 76 |
VIP | 0 |
好人卡 | 0 |
积分 | 97 |
经验 | 554 |
最后登录 | 2024-11-21 |
在线时间 | 570 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 9682
- 在线时间
- 570 小时
- 注册时间
- 2017-9-28
- 帖子
- 208
|
一般 api 会设计成传入一个由用户申请的空间,api 负责往里面填东西,比如,
假设是用 C 写的 dll,写一个 f 函数功能是填充 *:
- void f(char *buf, int size) { for (int i = 0; i < size; ++i) buf[i] = '*'; }
复制代码 那么 ruby 调用时:
- Win32API.new('a.dll', 'f', 'pl', 'v').call(buf = "\0" * 42, 42)
复制代码
当然,有的时候确实是 api 自己申请的字符串空间并返回地址(ruby 里会取到一个整数),这时候就要小心一点,
首先用 memcpy 或者 RtlMoveMemory 把 C 字符串从这个地址拿到 ruby 的一个字符串里,
然后记得自己 free 或者 api 提供 free 操作来释放空间
给一个参考实现:
- def ptr2str pointer
- assert!(Integer === pointer)
- len = api('kernel32', 'lstrlen').call pointer
- return '' if len.zero?
- str = [].pack("x#{len}")
- api('kernel32', 'RtlMoveMemory').call str, pointer, len
- str
- end
复制代码 |
评分
-
查看全部评分
|