//=====================================================================================================
//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下的控制台和硬體打交道的組件就是採用此機制和驅動進行通訊,唯一多出之處,就是組件會寫註冊表,然後再發送訊號;驅動接到訊號之後,先讀註冊表,根據讀取的數值對硬體進行操作.