首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

在Ruby中便利的调用Win32 API (使用windows-pr和CStruct)

2012-12-18 
在Ruby中方便的调用Win32 API (使用windows-pr和CStruct)缘由平时工作中,我主要使用C/C++和Ruby。有时经常

在Ruby中方便的调用Win32 API (使用windows-pr和CStruct)

缘由

平时工作中,我主要使用C/C++和Ruby。有时经常需要调用API来写一些工具,但又不想动用重量级的C/C++.这时就想到了用Ruby来写。话说Ruby,确实是程序员的好帮手,方便,快捷。是居家旅行......的必备良药。


在Ruby中有一个Win32API,是用来调用API的。但是用起来略为有点啰嗦和冗长。还好,RubyForge上有个Win32 Utils项目,专门提供了对API调用的封装,使得调用API更方便了一步。而且,Win32 Utils 已经分门别类的封装好了很多Windows的功能模块,可以直接使用。如win32-file,win32-dir等。


但是,有两个原因导致了Win32APIWin32 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.使用起来比较直观。下面进行分别介绍:

struct Point{ int x; int y;}; ?使用CStruct在Ruby中模拟结构体 Point:class Point < CStruct int32:x int32:yend?看起来是比较直观。看看Point的简单用法,来自CStruct的主页。require 'cstruct '# struct Point in Ruby:class Point < CStruct int32:x int32:yend# create a Point's instancepoint = Point .new# assign like as C languagepoint.x = 10point.y = 20puts "point.x = #{point.x},point.y = #{point.y}" ?CStruct提供了几个方法,用于取得结构体相关的信息,如(仅列出常用的):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 :dwAvailVirtualend?是不是挺像C语言的结构体?

# CStruct Examplesrequire '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 instancestat = MEMORYSTATUS.new {|st| st.dwLength = MEMORYSTATUS.size }# call API "GlobalMemoryStatus" - See also MSDNGlobalMemoryStatus(stat.data)#outputprintf "[Physical Memory]\n"printf " total:%12d bytes\n",stat.dwTotalPhysprintf " free :%12d bytes\n",stat.dwAvailPhysprintf "[Virtual Memory]\n"printf " total:%12d bytes\n",stat.dwTotalVirtualprintf " free :%12d bytes\n",stat.dwAvailVirtualprintf "[Paging File]\n"printf " total:%12d bytes\n",stat.dwTotalPageFileprintf " free :%12d bytes\n",stat.dwAvailPageFile上面的示例代码,像是用C直接调用API一样直观。免去了自己大量的pack,unpack。CStruct还有其他Win32的例子,比如:列举所有进程,获取系统信息等,获取系统版本等,有兴趣的可以看看。 结束本文到这里也就结束了,文本给出了在ruby中使用windows api的一个方便直观的方法。当然,CStruct目前还有一点限制,比如:多维数组(CStruct目前只支持一维数组)和位域 暂时还不支持。总的来说,windows-pr和CStruct结合使用,还是比较方便的。
主页的链接在这里:http://www.w-yong.com/docs/ruby_win32_api.html 1 楼 ray_linn 2010-11-10   结构体里的void**怎么处理? 2 楼 skandhas 2010-11-10   ray_linn 写道结构体里的void**怎么处理?
二维指针 也是 指针。在32平台下,用uint32或DWORD就能表示。

热点排行