IronRuby練手系列之一 寫個程序管理器

2021-08-25 07:38:20 字數 2709 閱讀 9892

用ironruby+sharpdevelop 來開發gui程式是十分便利的。《ironruby練手系列》計畫是用ruby來寫一系列的小工具,目的是來進一步熟悉ironruby.

我的機器裝的ironruby是ironruby 1.0 for .net 2.0 sp1

我的主頁:www.w-yong.com

本文章是寫乙個程序管理器,需要的主要知識點是:ruby語言,winform,win32 api等。本文的重點如題,是以ruby為主,而不是以"列舉程序"為主。

不過,還是略微提一下,取得系統中的程序資訊的方法主要有:

1.通過 tool help api 獲取

2.通過 psapi 獲取

3.通過 native api 獲取

4.通過 驅動來遍歷eprocess 獲取

5.對於.net,可以通過system.diagnostics 命名空間下的process類來獲取

6....

我們採用方式1,利用tool help api來獲取程序資訊。程式可以列舉出系統中正在執行的程序,選中某個程序,程式可以顯示出該程序載入的模組,還可以終止選中的程序。程式的執行結果如下:

這個程式的主要功能實際上是由processmanager這個類提供的。具體**的實現,大家可以看process_manager.rb這個檔案。processmanager中使用了cstruct這個類。cstruct是用ruby來模擬c語言的結構體,類似bitstruct。我寫cstruct這個類目的很明確,它不需要大而全,功能適中,使用起來比較方便。有了cstruct,我們就可以很方便的和win api打交道了。關於cstruct,我會另寫一篇文章來介紹它。在這裡,它只是跑龍套的。

我們先來看看 processmanager類提供的功能:

require 'process_manager'

#下面是一些使用procmgr的例子

procmgr = processmanager.new

# 列舉所有程序

procmgr.procs

# 根據名稱查詢程序資訊.(同名的都會被列舉)

procmgr.query("svchost.exe") id = #\n"}

# 按名稱終止程序(同名的都會終止)

procmgr.kill("notepad.exe")

# 按id終止程序

procmgr.kill(3412)

# 找出系統中載入了advapi32.dll的程序,

# 並列印出advapi32.dll在程序中的載入位置

procmgr.procs do |proc|

proc.modules do |mod|

if mod.name.casecmp('advapi32.dll')==0

printf"# loaded 'advapi32.dll' at %08x\n",mod.image_base

break

endend

end

有了processmanager提供的procs(列舉程序)和modules(列舉模組)這個兩個方法,我們就可以寫我們的gui版的程序管理器。大部分工作就是利用 sharpdevelop 做好介面布局。有一點需要說明,sharpdevelop 生成的變數名不太符合ruby的命名約定,你若覺得不習慣,可以改改。反正本文沒有改,兩者兼有之。程式中有兩個主要函式,show_processes和show_modules,**如下:  

show_processes:

def show_processes

# 清空 listview 控制項

@proclistview.items.clear

@proc_cache.clear

# 列舉系統程序

@procmgr.procs do |proc|

# 快取proc物件

@proc_cache

def show_modules seleced_proc

return unless seleced_proc

# 列舉選中程序的模組

seleced_proc.modules do |mod|

mod_items = @modlistview.items

# 取出模組檔案的圖示

# 將相關資訊插入到listview控制項中。

mod_items << system::string.new(system::text::encoding.getencoding(0).getchars(mod.path))

mod_items[mod_items.count-1].imageindex = @small_mod_imagelist.images.size-1

mod_items[mod_items.count-1].subitems.add sprintf("%08x",mod.image_base)

mod_items[mod_items.count-1].subitems.add sprintf("%08x",mod.image_size)

end# 設定 imagelist

@modlistview.smallimagelist = @small_mod_imagelist

end具體的**,請參考附件中的原始碼。

設計模式系列之一 寫在系列前面

網上看到很多部落格寫了 設計模式 系列,很佩服別人把一本書看完,還做了那麼詳細的筆記!最近工作,忙於瑣事,很久沒有靜下心來仔細系統的閱讀一本書了,都是需要什麼,就查閱相關資料。於是乎我也決定寫乙個系列,當作讀書筆記,促進自己學習,希望能堅持下來!看看自己是不是老了,還有沒有這個毅力?本系列以 hea...

隨便寫一寫

簡單的來說,就是公私合營的一種模式。針對大型的公共設施建設,這種模式有著很大的優點。天子山鎮因其坐落於著名的天子山腳下而得名,鎮區內分布著奇特的石英砂巖峰林地貌 茂密的原始森林和清澈的溪流,自然村落形成的田園風光獨具特色,當地流傳的向王天子傳說 土家山寨和集鎮上臨街而建的吊腳樓 青石板人行街道 古香...

第一寫部落格

說一下python 與c或c 在語法上的一些不同之處。在python中不會出現像c或c 一樣麻煩的規定符號 一些指令也要簡便許多。在python中 當你打出 按下回車時 電腦會自動幫助你縮排一格 縮排使得python的語言顯得非常精簡 當然要正確使用 否則會報錯 當你輸入pr時按下tab 電腦會自動...