缘由
平时工作中,我主要使用C/C++和Ruby。有时经常需要调用API来写一些工具,但又不想动用重量级的C/C++.这时就想到了用Ruby来写。
话说Ruby,确实是程序员的好帮手,方便,快捷。是居家旅行......的必备良药。
在Ruby中有一个Win32API
,是用来调用API的。但是用起来略为有点啰嗦和冗长。
还好,RubyForge上有个Win32 Utils
项目,专门提供了对API调用的封装,使得调用API更方便了一步。
而且,Win32 Utils 已经分门别类的封装好了很多Windows的功能模块,可以直接使用。如win32-file,win32-dir等。
但是,有两个原因导致了Win32API
和Win32 Utils
在使用上的不方便:
-
不管是Win32API
还是Win32 Utils
,虽然解决了调用API的问题,没有很好的解决结构体参数的问题。
我们知道,Windows的很多API大都需要结构体指针的参数,来传入或是传出信息。使用者大多利用String#unpack和Array#pack来处理。
-
Win32 Utils
提供的封装好的功能模块,如: win32-file,win32-dir等,是对API的进一步封装,将API封装在底下。
这样一来,如果想直接利用API来写程序的话,这些模块暂时就用不上了。
鉴于此,我的经验是使用
windows-pr
+
CStruct
来调用Windows的API.使用起来比较直观。下面进行分别介绍:
windows-pr
概述
Win32 Utils
中有3个十分重要的gem:
win32-api
,
windows-api
,
windows-pr
.其他的功能模块都是基于这三个之上。我们来说说这三个的关系:
-
win32-api
封装了对API的调用。主要就是一个dll: api.so
-
windows-api
对上面的 win32-api进行了简单包装,使得使用更简单一些。
-
windows-pr
依赖与上面两个,定义了大量的Win32的API和常量,免去了我们自己定义函数的麻烦。当然,也有一些API没有封装,还得需要我们自己动手。
安装
windows-pr的安装很简单:
gem install windows-pr
但是,如果你用的是ruby 1.9.x,则需要特别注意:安装windows-pr时,同时会安装
win32-api
,默认的情况会安装:win32-api-1.4.6-x86-mingw32。但这个gem是基于ruby1.8.x的,所以在Ruby1.9.x上不能正确运行。
解决方案如下:
-
安装windows-pr: gem install windows-pr
这一步,会给你安装3个gem:windows-pr,windows-api 和win32-api-1.4.6-x86-mingw32 (win32-api当前版本是:1.4.6)
-
安装DevKit
按照官方
的步骤来,很简单。DevKit主要就是用来编译Ruby本地扩展的。
-
安装win32-api:gem install win32-api --platform=ruby
这一步,会安装gem:win32-api-1.4.6,并生成新的api.so
-
用win32-api-1.4.6的api.so 替换掉win32-api-1.4.6-x86-mingw32中的api.so。
还有一个偷懒的办法,这里有一个编译好的适合ruby1.9.x的
api.so
,请下载下来,在执行完第一步之后,直接进行第4步,替换掉api.so即可。如果仍然不好用,则还需要你亲自编译一下。
使用
实际上,Win32 Utils封装的windows的各个功能模块就是使用windows-pr的例子,有兴趣的,可以看看。大家对Win32 Utils也比较熟悉,这里就不过多介绍了。
CStruct
概述
CStruct是Ruby 语言用来模仿 C 语言结构体。
有过Win32开发经验的童鞋们一定都知道,Win32 SDK中,大部分的API都需要有结构体指针作参数。例如: void GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
Ruby基本的二进制操作主要是利用String#pack和Array#unpack来进行。但是,如果来处理C语言中的结构体就有些冗长啰嗦了。
如何能模拟C语言中的结构体呢?
CStruct
就是来做这个事情的。(注意:此CStruct 并不是 DL模块中的CStruct!)
这里只是大体介绍一下CStruct。更多的信息及示例,请看CStruct项目的主页
.
安装
CStruct的安装也很简单:
gem install cstruct
CStruct的基本用法
先看一个C语言的结构体Point:
struct Point
{
int x;
int y;
};
使用CStruct在Ruby中模拟结构体 Point:
class Point < CStruct
int32:x
int32:y
end
看起来是比较直观。看看Point的简单用法,来自CStruct的主页。
require 'cstruct '
# struct Point in Ruby:
class Point < CStruct
int32:x
int32:y
end
# create a Point's instance
point = Point .new
# assign like as C language
point.x = 10
point.y = 20
puts "point.x = #{point.x},point.y = #{point.y}"
CStruct提供了几个方法,用于取得结构体相关的信息,如(仅列出常用的):
Win32Struct
Win32Struct是CStruct带的一个对常用的win32数据类型的封装。在定义windows结构体时,主要用它。使用的时候,需要 require 'win32struct'
Win32中的MEMORYSTATUS 的定义基本如下面这个样子:
struct MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORD dwTotalPhys;
DWORD dwAvailPhys;
DWORD dwTotalPageFile;
DWORD dwAvailPageFile;
DWORD dwTotalVirtual;
DWORD dwAvailVirtual;
} ;
使用Win32Struct在Ruby中模拟结构体 MEMORYSTATUS:
class MEMORYSTATUS < Win32Struct
DWORD :dwLength
DWORD :dwMemoryLoad
DWORD :dwTotalPhys
DWORD :dwAvailPhys
DWORD :dwTotalPageFile
DWORD :dwAvailPageFile
DWORD :dwTotalVirtual
DWORD :dwAvailVirtual
end
是不是挺像C语言的结构体?
windows-pr & CStruct
有了windows-pr
和CStruct
,我们就可以很直观的直接调用API了。来看一个具体的例子:GlobalMemoryStatus(获取系统的内存状态)。
# CStruct Examples
require 'windows/memory'
require 'win32struct'
include Windows::Memory
# example:
# typedef struct _MEMORYSTATUS {
# DWORD dwLength;
# DWORD dwMemoryLoad;
# DWORD dwTotalPhys;
# DWORD dwAvailPhys;
# DWORD dwTotalPageFile;
# DWORD dwAvailPageFile;
# DWORD dwTotalVirtual;
# DWORD dwAvailVirtual;
# } MEMORYSTATUS, *LPMEMORYSTATUS;
class MEMORYSTATUS < Win32Struct
DWORD :dwLength
DWORD :dwMemoryLoad
DWORD :dwTotalPhys
DWORD :dwAvailPhys
DWORD :dwTotalPageFile
DWORD :dwAvailPageFile
DWORD :dwTotalVirtual
DWORD :dwAvailVirtual
end
# create a MEMORYSTATUS's instance
stat = MEMORYSTATUS.new {|st| st.dwLength = MEMORYSTATUS.size }
# call API "GlobalMemoryStatus" - See also MSDN
GlobalMemoryStatus(stat.data)
#output
printf "[Physical Memory]\n"
printf " total:%12d bytes\n",stat.dwTotalPhys
printf " free :%12d bytes\n",stat.dwAvailPhys
printf "[Virtual Memory]\n"
printf " total:%12d bytes\n",stat.dwTotalVirtual
printf " free :%12d bytes\n",stat.dwAvailVirtual
printf "[Paging File]\n"
printf " total:%12d bytes\n",stat.dwTotalPageFile
printf " free :%12d bytes\n",stat.dwAvailPageFile
上面的示例代码,像是用C直接调用API一样直观。免去了自己大量的pack,unpack。
CStruct还有其他Win32的例子,比如:
列举所有进程
,
获取系统信息等
,
获取系统版本等
,有兴趣的可以看看。
结束
本文到这里也就结束了,文本给出了在ruby中使用windows api的一个方便直观的方法。
当然,CStruct目前还有一点限制,比如:多维数组(CStruct目前只支持一维数组)和位域 暂时还不支持。总的来说,windows-pr和CStruct结合使用,还是比较方便的。
分享到:
相关推荐
api-ms-win-crt-environment-l1-1-0.dll
Win32OLE extension library provides an interface to OLE Automation from Ruby. Here is a sample script: require 'win32ole' application = WIN32OLE.new('Excel.Application') application.visible = TRUE...
ice最简单实现 ruby调用ice接口 - Ruby - language - ITeye论坛
google-api-ruby-client-samples 是 Google API Ruby 客户端的示例。 标签:google
ruby中英文api 适合于初学者。 希望能给大家带来一些帮助
ruby 游戏开发 gosu-windows-ruby-0.7.14.zip
Api-dnsimple-ruby.zip,用于ruby的dnsimple api客户端。dnsimple ruby客户端,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中...
This ZIP archive contains a DLL for the SQLite library version 3.7.6. The DLL is built using SQLITE_ENABLE_COLUMN_METADATA so that it is suitable for use with Ruby on Rails.
Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档Ruby API 帮助文档
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。 Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。...
NULL 博文链接:https://skandhas.iteye.com/blog/809806
mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe
使用Ruby和GitHub API构建Action的快速入门配方
由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言...
ruby 1.8.5 Windows版本的One-Click Install安装之后,Tk可能无法正常运行,运行行require "tk"可能会报告找不到DLL或其他错误信息。这似乎是次版本的一个bug。解决此问题的方法之一是安装ActiveTcl.把tk84.dll放到...
forecast-ruby, 用于从预测天气API中检索数据的ruby gem forecast_ioruby 中的forecast.io API包装器。安装gem install forecast_io或者你的Gemfilegem 'forecast_io'用法确保你需要库。requir
ruby-oci8-2.1.5-x86-mingw32.gem,ruby连接oracle数据库gem包
ruby 帮助资料 API ruby 帮助资料 API ruby 帮助资料 API ruby 帮助资料 API ruby 帮助资料 API
qtbindings - 允许你在Ruby中使用QT Gui工具包
规范 - 用例用户可以访问/查看 github 表情符号列表访问令牌可选:测试使用 API 的代码概括API 是应用程序使用的接口JSON HTTP GET、POST 等RESTful 路由戳 API 的工具curl - 命令行- Chrome在您的应用程序中使用 ...