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下的控制面板和硬件打交道的组件就是采用此机制和驱动进行通信,唯一多出之处,就是组件会写注册表,然后再发送信号;驱动接到信号之后,先读注册表,根据读取的数值对硬件进行操作.

posted @ 2006-02-25 12:49  我的一天  阅读(144)  评论(0编辑  收藏  举报