VB對低層硬體的訪問控制

2021-04-02 12:57:51 字數 4273 閱讀 6890

---- 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...