第一次写东西,把前段时间在做的一个小项目整理一下吧。
做的是windows下实现IO口的操作,实现人体感应,让程序和系统能根据人体感应器来做一些动作。
首先要知道的是,主板上的gpio针脚的物理地址,这个可以看下主板说明书。
由于windows不能像linux一样直接操作底层,所以有位牛人写了一个winio库,winio库通过使用内核模式下设备驱动程序和其它一些底层编程技巧绕过windows安全保护机制,允许32位windows程序直接对I/O口进行操作。WinIo包含了3个文件:WinIo.dll、WinIo.sys、WinIo.lib和WINIO.VXD,其中WINIO.VXD驱动程序用在Win95/98系统上,WinIo.sys驱动程序用在WinNT/2000/XP系统上,WinIo.dll提供了功能函数的调用。在 WinIo.dll中有两个函数最重要:InitializeWinIo用来初始化WinIo的驱动程序,必须在调用所有其它功能函数之前调用该函数;ShutdownWinIo用来卸载WinIo的驱动程序,在中止应用函数之前或者不再需要使用WinIo时调用。在初始化完成之后就可以直接读写 I/O端口而不会出现非法操作,winio库现在更新到3.0了,去百度google一下就能找到了。
举个例子直接贴代码吧,例子是参考了他人的思路,如果侵权请联系。
比如这个例子程序实现的功能是,当有人过来的时候,系统就修改下分辨率,只是个例子啦,当然真正用的话没那么无聊。
#ifndef WINIOTEST_H #define WINIOTEST_H #pragma once #include #include #include #include class CONTROL{ protected:HWND hwndDialog;int ReadByteFromEC(int offset, char *pdata);int WriteByteToEC(int offset, char data);public:CONTROL(HINSTANCE );~CONTROL(); }; #endif //WINIOTEST_H
#include
#include
#include "winio.h"
#include "winiotest.h"
#include
#include "stdafx.h"
using namespace std;
#define GPIO_BASE_ADDRESS 0x500
#define EC_DATAPORT0x0e
#define EC_CTRLPORT0x0c
#define EC_STAT_OBF0x01
#define EC_STAT_IBF0x02
#define EC_STAT_CMD0x08
#define EC_CTRLPORT_READ(char)0x80
#define EC_CTRLPORT_WRITE(char)0x81
#define EC_CTRLPORT_QUERY(char)0x84
int verbosity= 0;
char lasterrorstring[256]= "",
logbuf[8192]= "";
void GetScrnEERO(LONG i)
{
在编译的时候记得把winio.lib加到项目中,不然会编译不过去。