C++builder 中使用动态链接库
技术实现端口读写的方法
唐艳华
1
吴军
2
(1.湖南都市职业学院,湖南 长沙 410137;
2.中国电能成套设备有限公司,北京 100011)
摘 要 Windows 操作系统与设备的无关性给程序开发人员编写设备驱动程序带来很大的麻烦。针对
这一问题,本文结合在 Windows 下使用 C++Builder 开发特高压并联电力电抗器故障在线监测系统的
工程实际,介绍了一种如何在 C++ Builder 中利用动态链接库技术快速实现端口读写的方法。该方法简
单可行,无须编写复杂的设备驱动程序即可实现对端口的操作,从而大大缩短实时监控软件的开发周期,
减少程序员的工作量。
关键词 Windows;C++ Builder;端口读写;动态链接库
1 引言
由于 Windows 提供了标准的用户界面、图形处理能力和简单灵便的操作,绝大多数程序编制人员都
已转向 Windows 编程。许多用户在设计实际应用系统的编程任务中,常常要实现软件对硬件资源和内存
资源的访问,例如端口 I/O、DMA、中断、直接内存访问等。若是编制 DOS 程序,这是轻而易举的事情,
但编制 Windows 程序,就会显得比较困难。因为 Windows 具有"设备无关"的特性,不提倡与机器底层
的东西打交道,如果直接用 Windows 的 API 函数或 I/O 读写指令进行访问和操作,程序运行时往往就会
产生保护模式错误甚至死机,更严重的情况会导致系统崩溃。实践开发过程中,大量的工业控制仅涉及端
口的读写,无须使用中断。本文结合工程实际,提供一种在 32 位应用程序中实现端口操作的简便方法。
2 基本原理
Intel 80X86 CPU 系列芯片可在三种模式下工作:实模式、保护模式和 V86 模式。实模式是 MS-
DOS 的运行环境。Windows 只利用了后两种模式,保护模式虽给我们带来了诸多的优越性,但在该模式
下,所有的应用程序都有权限级别,使用 C++ Builder,VC++等 SDK 工具开发的应用程序一般是运行
在 Ring 3 级
[1]
,它们享有的权限是最低的,不能绕过操作系统直接对硬件进行操作。
笔者在 Windows 下使用 C++Builder 开发特高压并联电力电抗器油中故障气体在线监测系统中,利
用北京双诺公司的 AC1856 A/D 采集卡作为数据采集器,每块卡上有四路 A/D 转换通道,具有 64K 点/
通道的采样容量,转换结束后,可从 202H 端口读取数据。在开发过程中发现:可以通过动态链接库
(DLL)技术绕过 Windows 操作系统,从而实现对端口的直接操作。其原理是:首先运用 C++
Builder 编写一个动态链接库文件,在动态链接库中封装笔者的端口读写函数(C++ Builder 中不再支
持 inportb(),outportb()等一类 I/O 函数),然后将该 DLL 文件通过工程管理员添加到应用程序的工程
中,这样就可在应用程序中使用 I/O 函数实现端口的读写,如图 1 所示。