---- vb沒有提供直接訪問低層硬體的控制項和方法,一度給對訪問硬體感興趣的程式設計者帶來不便。目前我們可從網上搜尋到支援低層硬體訪問的dll和activex控制項,通過它們可讀寫儲存器單元、埠,甚至控制硬體中斷。下面通過兩個利用dll和activex控制項示例介紹vb對低層硬體的訪問控制。
---- 一、利用dll讀寫埠
anjan dll的解鎖過程
inp 埠讀位元組函式
inpw 埠讀字函式
out 埠寫位元組過程
outw 埠寫字過程
getlptbaseaddr 獲取並口基位址的函式
getcombaseaddr 獲取串列埠基位址的函式
---- 圖1是乙個發聲示例程式的窗體,在輸入框中鍵入一頻率值並按soundon鈕,則在pc機的揚聲器中發出指定頻率音調,程式中對音調的變化、聲音的開關是用vbio.dll的過程和函式訪問發聲系統的定時器/計數器和控制埠實現的。程式設計要點:1、應在form _load中加入anjan解鎖過程。2、若在模組中宣告函式和過程,應去掉private或用public替代。3、vbio.dll應拷貝到/windows/system子目錄下。
---- 程式清單:
option explicit
private declare sub
anjan lib "vbio.dll" ()
private declare function
inp lib "vbio.dll" (byval port&) as integer
private declare function
inpw lib "vbio.dll" (byval port&) as long
private declare sub
out lib "vbio.dll" (byval port&, byval byt%)
private declare sub
outw lib "vbio.dll" (byval port&, byval wrd&)
private declare function
getlptbaseaddr lib "vbio.dll" (byval lpt&) as integer
private declare function
getcombaseaddr lib "vbio.dll" (byval com&) as integer
public sub setfreq(soundhz as integer)
』設定頻率
if soundhz then
dim divisor as long
divisor = 1193180 / soundhz
'計算時間常數
out &h42, &hb6
'8253-5通道2設定為方式3
out &h42, divisor mod 256
'送時間常數
out &h42, divisor / 256
'speaker true
else
speaker false
end if
end sub
public sub speaker(son as boolean)
』開關聲音
dim portval as integer
portval = inp(&h61)
'if son then
portval = portval or 3
'低位為通道2的門控訊號
else
'次低位為整形與門控制訊號
portval = portval and (not 3)
end if
out &h61, portval
end sub
private sub form_load()
anjan
』軟體解鎖
end sub
private sub soundoff_click()
speaker false
end sub
private sub soundon_click()
setfreq val(texthz)
end sub
---- 二、利用activex處理硬體中斷
---- 2、把ocx子目錄下的tvichw32.ocx拷貝到/windows/system子目錄下,並在dos命令列狀態下鍵入以下命令進行註冊。
---- regsvr32 tvichw32.ocx
---- 3 、在vb環境下通過選單工程--部件--控制項並選擇tvichw32 activex control module將控制項新增到工具箱中。
---- 4、相關的屬性、方法及事件
---- 方法 opendriver 開啟支援訪問硬體的驅動程式vichw.vxd(windows95下)
---- 方法 closedriver 關閉驅動程式
---- 屬性 activehw as bool 驅動程式開啟則為true;關閉為false 中斷事件 onhwinterrupt(byval hwcounter as long,
byval lpt_datareg as integer,
byval lpt_statusreg as integer,
byval scancode as integer)引數
hwcounter : 中斷次數
lpt_datareg : 如果使用irq7,則為列印並口的資料
lpt_statusreg : 如果使用irq7,則為列印並口的資料
scankode : 如果使用irq1,則為按鍵的掃瞄碼
屬性 irqnumber 指定中斷號,範圍irq1--15
屬性 irqmasked 中斷非遮蔽則為true;遮蔽為false
---- 圖2(略)是示例的窗體,程式執行後首先按open_driver鈕開啟驅動程式,然後選擇unmarsk核取方塊開放中斷,此時每按一次鍵框中分別顯示該鍵的掃瞄碼和中斷次數。處理其它中斷只需更改中斷號即可(中斷號1--15)。
---- 程式清單:
public sub showbuttons()
open_driver.enabled = not hwctrl.activehw
close_driver.enabled = hwctrl.activehw
b_unmask.enabled = hwctrl.activehw
end sub
private sub form_load()
showbuttons
end sub
private sub open_driver_click()
hwctrl.opendriver '開啟驅動程式
if not hwctrl.activehw then
msgbox ("the driver vichwxx not found")
else:
hwctrl.irqnumber = 1 '中斷號為1,鍵盤中斷
end if
showbuttons
end sub
private sub close_driver_click()
hwctrl.closedriver '關閉驅動程式
b_unmask.value = 0
showbuttons
end sub
private sub b_unmask_click()
if b_unmask.value = 0 then
hwctrl.irqmasked = true
else
hwctrl.irqnumber = 1
scan_code = 0
hwctrl.irqmasked = false '開放中斷
end if
end sub
private sub hwctrl_onhwinterrupt(byval hwcounter
as long, byval lpt_datareg as integer, byval
lpt_statusreg as integer, byval scancode as integer)
scan_code.caption = scancode
irqc.caption = hwcounter
end sub
VB中對AutoCAD控制視窗介面
視窗介面控制包括autocad應用程式視窗介面控制和autocad繪圖視窗控制,以及vb視窗介面和autocad視窗介面的相互切換。利用autocad應用程式物件的屬性,可以控制或查詢autocad視窗介面的現實狀態。上語句分別將autocad視窗設定為最大 最小和一半狀態,最後一句將autocad...
通過API實現C 對硬體的控制(一)
最近在做專案的過程中,涉及到對硬體啟用及禁用的功能 在指定時間段內才能啟用硬體 因為c 自身對硬體的操作基本為零,為此,搜尋了一下msdn中與裝置相關的api函式。還果然就有。下面一一枚舉出各函式的原型及相關的說明文件。並將其轉為c 實現。原型 hdevnotify winapi registerd...
通過API實現C 對硬體的控制(二)
原文 下面是該類的 using system using system.collections.generic using system.text using system.runtime.interopservices namespace hardware wm devicechange mess...