wince下所有的驅動都是以dll的形式,被device.exe程序載入的,所以每個驅動程式中都要實現dllentry函式。
在登錄檔的hkey_local_machine\drivers\usb\loadclients\鍵下儲存了usb host的驅動程式資訊。當我們第一次插入usb裝置時。因為不存在這樣的資訊,所以系統會彈出乙個「
未能識別的usb裝置」的對話方塊,要求使用者輸入驅動程式的名稱。該名稱就是usb host驅動dll的檔名。在輸入了名稱後,系統會自動呼叫該dll的usbinstalldriver函式。該函式
負責向登錄檔新增usb host驅動的資訊,以便再次插入裝置時,能夠識別該usb裝置。其原型如下:
bool usbinstalldriver(lpcwstr szdriverlibfile);
其中szdriverlibfile就是輸入的dll檔名稱。返回true表示註冊成功。
在向登錄檔註冊usb host資訊時,不能使用普通的登錄檔函式,只能使用usbd提供的註冊函式。
bool registerclientdriverid(lpcwstr szuniquedriverid);
bool registerclientsettings(lpcwstr szdriverlibfile, lpcwstr szuniquedriverid, lpcwstr erved, lpcusb_driver_settings lpdriversettings);
這兩個函式在usbd.dll中,可以通過動態方式呼叫,也可以通過靜態方式呼叫。
動態方式如下:
hinstance hinst = loadlibrary(l"usbd.dll");
if(hinst) usb_driver_settings;
count為結構體大小,其他項對應usb描述符。
其中除count外的各欄位,如果不設定具體的值,可以設定為usb_no_info。
這個結構體中的資訊講反應到登錄檔的hkey_local_machine\drivers\usb\loadclients\鍵下,用於在usb裝置插入時,查詢usb驅動。下面以乙個例子說明:
bool usbinstalldriver(lpcwstr szdriverlibfile)
else
retailmsg(1,(text("registerclientdriverid error\r\n")));
return fret; }
在wince中,將設定資訊分為了三組,每組3個值,
第一組:
dwvendorid、dwproductid、dwreleasenumber
第二組:
dwdeviceclass、dwdevicesubclass、dwdeviceprotocol
第三組:
dwinte***ceclass、dwinte***cesubclass、dwinte***ceprotocol
如果註冊成功,將會在hkey_local_machine\drivers\usb\loadclients\鍵下出現 「第一組\第二組\第三組\註冊id\dll」這樣的建,鍵值為dll驅動名稱。其中每組又是由三個值中間加下劃線組成。如果有乙個值設定為usb_no_info,則鍵名不包括該值。如果整個組中每個值都設定成usb_no_info,則鍵名為default。
據上面的例子,在我的系統下,將會生成如下鍵名:
hkey_local_machine\drivers\usb\loadclients\4292_3\default\0_0_0\usbtest\dll = "myusbtest" (我的驅動程式為myusbtest.dll)
當使用者插入usb裝置時,它會讀取usb裝置的描述符,根據描述符中的值在登錄檔中查詢驅動程式名稱。
現在假設,我們要wince只支援usb鍵盤,另外我們自己實現乙個usb滑鼠驅動程式。如果不加注意,我們的usb滑鼠驅動程式將不能被呼叫。原因正是在於這個查詢usb裝置驅動的過程。wince提供的usbhid驅動程式的登錄檔資訊是
hkey_local_machine\drivers\usb\loadclients\default\default\3\hid_class\dll = "usbhid.dll"
其中第三組資訊只使用了dwinte***ceclass,而usb鍵盤和usb滑鼠只有dwinte***ceprotocol不同。所以,乙個3概括了所有的hid,當我們的usb滑鼠插入系統後,將會呼叫usbhid.dll驅動程式處理,但是它只包括鍵盤的驅動,沒有滑鼠的驅動,所以滑鼠不能使用。要想使得自定義的usb滑鼠可以使用,則將第三組的值都設定上,如下:
hkey_local_machine\drivers\usb\loadclients\default\default\3_1_1\hid_class\dll = "usbhid.dll"
如此一來,當值為3_1_2的滑鼠插入後,因為找不到對應的鍵值,將提示要求我們輸入usb滑鼠的驅動。
詳解WinCE下USB Host驅動開發 1
wince下所有的驅動都是以dll的形式,被device.exe程序載入的,所以每個驅動程式中都要實現dllentry函式。在登錄檔的hkey local machine drivers usb loadclients 鍵下儲存了usb host的驅動程式資訊。當我們第一次插入usb裝置時。因為不存...
WinCE下Socket程式設計
wince下socket程式設計 wince 不支援win32中socket非同步類 那個mfc類忘記啥名字了 在軟體開發中 網路程式設計 是必不可少的基本功了 本文所講的 socket 程式設計也就是網路程式設計中的一種形式 當然你如果想問我什麼叫 socket 很遺憾的是我也不能準確的告訴你!但...
詳解WINCE的控制面板
extern c message case cpl dblclk case cpl stop called once for each dialog box.used for cleanup.case default return 0 return codearea codearea pre lin...