jneu能否告诉我在什么地方,谢了先!

解决方案 »

  1.   

    B对低层硬件访问控制 
    VB 没 有 提 供 直 接 访 问 低 层 硬 件 的 控 件 和 方 法, 一 度 给 对 访 问 硬 件 感 兴 趣 的 编 程 者 带 来 不 便。 目 前 我 们 可 从 网 上 搜 索 到 支 持 低 层 硬 件 访 问 的DLL 和ActiveX 控 件, 通 过 它 们 可 读 写 存 储 器 单 元、 端 口, 甚 至 控 制 硬 件 中 断。 下 面 通 过 两 个 利 用DLL 和ActiveX 控 件 示 例 介 绍VB 对 低 层 硬 件 的 访 问 控 制。 
    一、 利 用DLL 读 写 端 口----若 在 应 用 程 序 中 只 是 简 单 地 读 写 端 口, 利 用DLL 编 程 实 现 较 为 简 便。 从http://personal.vsnl.com/sr (这个网站好象进不了?:< 去其他地方找找?)网 站 可 下 载 一 个 免 费 的32 位VBIO.DLL, 该 连 接 库 允 许 在VB4、5 或6 中 使 用, 共 有 七 个 函 数 和 过 程, 分 别 为:Anjan            DLL 的 解 锁 过 程
    Inp              端 口 读 字 节 函 数
    Inpw             端 口 读 字 函 数
    Out              端 口 写 字 节 过 程
    Outw             端 口 写 字 过 程
    GetLptBaseAddr    获 取 并 口 基 地 址 的 函 数
    GetComBaseAddr   获 取 串 口 基 地 址 的 函 数
    ----图1(我也没有看见图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 IntegerPublic 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 SubPublic 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 SubPrivate Sub Form_Load()
    Anjan  ' 软 件 解 锁
    End SubPrivate Sub SoundOff_Click()
    Speaker False
    End SubPrivate Sub SoundOn_Click()
    SetFreq Val(TextHz)
    End Sub
    二、 利 用ActiveX 处 理 硬 件 中 断
    ----在 应 用 程 序 中 如 果 需 要 访 问 存 储 单 元、 端 口 以 及 处 理 硬 件 中 断, 使 用TVicHW32 ActiveX 控 件 是 一 很 好 的 选 择, 该 控 件 是 一 个 共 享 软 件, 支 持Windows 95/98/NT, 可 从 http://www.entechtaiwan.com/tools.htm 处 下 载。 该 控 件 除 具 备 直 接 访 问 存 储 单 元 和 端 口 的 功 能 外, 还 提 供 了 丰 富 的 处 理 并 口 的 属 性 和 方 法, 以 及 处 理 硬 件 中 断 的 属 性、 方 法 和 事 件, 极 大 地 拓 展 了VB 对 低 层 硬 件 的 访 问 控 制。 下 面 通 过 一 个 显 示 键 盘 中 断 次 数 和 按 键 扫 描 码 的 示 例 介 绍 控 件 的 使 用 过 程。 
    下 载TVicHW32 压 缩 软 件 包 并 解 压 到 一 个 目 录 中, 如\HW。 把 driver 子 目 录 下 的vichw00.vxd 文 件 拷 贝 到\windows\system 子 目 录 下, 该 文 件 是 控 件 访 问 硬 件 的 驱 动 程 序, 使 用 控 件 前 先 用OpenDriver 打 开, 最 后 用Close_Driver 方 法 关 闭。 
    把ocx 子 目 录 下 的tvichw32.ocx 拷 贝 到\windows\system 子 目 录 下, 并 在 DOS 命 令 行 状 态 下 键 入 以 下 命 令 进 行 注 册:
    ----regsvr32 tvichw32.ocx 
    在VB 环 境 下 通 过 菜 单 工 程 - - 部 件 - - 控 件 并 选 择TVicHW32 ActiveX Control Module 将 控 件 添 加 到 工 具 箱 中。 
    相 关 的 属 性、 方 法 及 事 件 
      方 法        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 SubPrivate Sub Form_Load()
    ShowButtons
    End SubPrivate 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 SubPrivate Sub Close_Driver_Click()
     HwCtrl.CloseDriver  ' 关 闭 驱 动 程 序
     B_Unmask.Value = 0
     ShowButtons
    End SubPrivate 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 SubPrivate 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