WinCE 控制面板和驱动通信
//=====================================================================================================
//AUTHOR:
// norains
//DATE:
// Saturday 25-Feb-2006
//=====================================================================================================
控制面板有不少组件,是直接和驱动通信的,其过程一般如此(以创建一个"MyBacklightChange"事件为例子):
1.驱动初始化,并创建一个线程,在线程内部创建一个通信的事件
Class MyDriver
{
....
private:
void MyInit();
//一个线程处理程序,注意在这里必须声明为static,否则编译(PB4.1)的时候会出错,不知道为什么
static DWORD WINAPI MyBacklightChangeThreadProc(PVOID pArg);
....
}
//驱动初始化函数:
MyDriver::MyInit()
{
....
//-------------------------------
//创建一个线程
HANDLE hMyThread;
DWORD dwMyThreadID;
//CreateThread函数调用之后,会进入到线程处理函数MyBacklightChangeThreadProc里面去
hMyThread=CreateThread(NULL,0,MyBacklightChangeThreadProc,0,0,&dwMyThreadID);
//由于MyBacklightChangeThreadProc是一个死循环,所以一般不会执行到关闭线程这段
if(hMyThread!=NULL)
{
CloseHandle(hMyThread);
}
....
}
2.在驱动线程内部的死循环体调用WaitForSingleObject()函数进行等待
DWORD WINAPI SocLcd::MyBacklightChangeThreadProc(PVOID pArg)
{
//创建一个背光灯事件,事件名称要与控制面板创建的事件名相同
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"MyBacklightChange");
//死循环,不断接受信息
while(true)
{
//如果控制面板不发送信号,则此线程会一直停留在WaitForSingleObject处
WaitForSingleObject(hEvent, INFINITE);
//-------------------------------------------------------------------------
//只有获得信号之后,才会往这里执行
//在这里执行相关操作,比如:读写注册表,操作寄存器等等
//-------------------------------------------------------------------------
}
CloseHandle(hEvent);
return 0;
}
3.接下来,我们来看看控制面板如何发送信号
DWORD SendEvent()
{
//在这里创建一个事件,注意:此事件的名称必须要和驱动接收的名称相同,否则驱动无法获取信号
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"MyBacklightChange");
if (hEvent != NULL)
{
//发送信号
SetEvent(hEvent);
CloseHandle(hEvent);
return TRUE;
}
return FALSE;
}
windows ce下的控制面板和硬件打交道的组件就是采用此机制和驱动进行通信,唯一多出之处,就是组件会写注册表,然后再发送信号;驱动接到信号之后,先读注册表,根据读取的数值对硬件进行操作.