• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            玩心未泯

            卡爾斯希普拉斯

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              19 Posts :: 0 Stories :: 98 Comments :: 0 Trackbacks
                     昨天太忙,沒來得及寫,今天晚上火車要回武漢了,5.1估計(jì)沒空寫,這兩天又有不少新發(fā)現(xiàn)想要些出來跟大家分享,但是一下子又理不清出頭緒,還是不能著急,慢慢寫,不要讓列位看官越看越糊涂才好。
                     上一篇咱們寫到了USB驅(qū)動(dòng)必須實(shí)現(xiàn)的三個(gè)入口函數(shù):USBInstallDriver,USBUnInstallDriver和USBDeviceAttach。這一篇就主要介紹一下這幾個(gè)函數(shù)(及另外兩個(gè)函數(shù):ActivateDevice和USBDeviceNotificationCallback,有時(shí)間的話,后來發(fā)現(xiàn)沒時(shí)間寫這么長了Attach都寫不完,只好下篇再寫)。
                     其實(shí)網(wǎng)上搜索到的關(guān)于WinceUSB驅(qū)動(dòng)開發(fā)的文章都有介紹這些函數(shù),這些函數(shù)干什么用的,里面調(diào)用了那些東東都有說明,但是似乎天下文章一大抄的原則永遠(yuǎn)沒有改變,每篇文章說的內(nèi)容都差不多,還有些該說明的細(xì)節(jié)根本沒有一篇提到過,根本就不是給新手入門看的,我想可能學(xué)習(xí)Wince驅(qū)動(dòng)開發(fā)最大的疑惑就是哪些是我們該做的,哪些是不需要我們作的,我在學(xué)習(xí)的時(shí)候,看了這些所謂的入門文章,還是沒有完全搞清楚,所以我才專門用一篇的篇幅把我研究所得寫出來,可能會(huì)對新入門的朋友有所幫助。
                     先說USBInstallDriver,這個(gè)函數(shù)在驅(qū)動(dòng)程序DLL被加載的時(shí)候會(huì)被調(diào)用,但是不是任何情況下加載驅(qū)動(dòng)都會(huì)調(diào)用這個(gè)函數(shù)入口,前面提到過USB驅(qū)動(dòng)的注冊表鍵值,當(dāng)系統(tǒng)能夠根據(jù)注冊表定位到驅(qū)動(dòng)程序dll并且成功加載的話,這個(gè)函數(shù)就不會(huì)被調(diào)用了。反之,當(dāng)不能夠找到匹配的驅(qū)動(dòng)或者不能夠成功加載驅(qū)動(dòng)的時(shí)候,系統(tǒng)會(huì)彈出一個(gè)對話框,讓用戶輸入一個(gè)驅(qū)動(dòng)程序名稱,這個(gè)時(shí)候,系統(tǒng)就會(huì)加載用戶輸入的這個(gè)驅(qū)動(dòng)程序文件,并調(diào)用其中的USBInstallDriver函數(shù)了。USBUnInstallDriver函數(shù)呢,我很迷惑,《WindowCE驅(qū)動(dòng)開發(fā)指南》有一句話說WinCE永遠(yuǎn)不會(huì)調(diào)用它,我也不明白,但是就我測試的結(jié)果來看,確實(shí)沒發(fā)現(xiàn)這個(gè)函數(shù)被調(diào)用過。
                    USBInstallDriver函數(shù)里面作什么的呢?說白了,就是寫注冊表,讓系統(tǒng)下次能夠通過注冊表信息匹配到這個(gè)驅(qū)動(dòng)程序文件。其他文章都說了,怎么寫注冊表,就是用USBD.dll中的RegisterClientDriverID和RegisterClientSettings兩個(gè)函數(shù),少不了LoadLibrary,GetProcAddress,F(xiàn)reeLibrary。網(wǎng)上看到過一個(gè)問題,問驅(qū)動(dòng)程序不是被USBD進(jìn)程加載的么?為什么不能直接用這個(gè)兩個(gè)函數(shù),還要LoadLibrary和GetProcAddress來調(diào)用這些函數(shù)呢?我不知道怎么去解答這個(gè)問題,只覺得即使在一個(gè)進(jìn)程里面,似乎不這樣你也得不到這兩個(gè)函數(shù)的地址吧。至于到處都說USBInstallDriver里面不要用Reg的API函數(shù)去操作注冊表,卻沒有個(gè)所以然,這個(gè)應(yīng)該是因?yàn)檫@些注冊表主鍵可能會(huì)根據(jù)操作系統(tǒng)的變更而變更的,而不論你是哪個(gè)操作系統(tǒng),RegisterClientDriverID和RegisterClientSettings都會(huì)找到對應(yīng)的正確的注冊表主鍵去添加值,所以建議不要用regAPI來操作,換句話說你用了RegAPI去操作注冊表,寫入信息,也不會(huì)有什么問題,除非你的wince系統(tǒng)中那些驅(qū)動(dòng)信息不應(yīng)該寫在那幾個(gè)主鍵下了。
                    要注意的一點(diǎn)是:在RegisterClientSettings的參數(shù)中,給的USB_DRIVER_SETTINGS(內(nèi)有9個(gè)ID)如果和你的設(shè)備的ID對不上,結(jié)果就是系統(tǒng)仍然不能夠通過注冊表信息加載你的驅(qū)動(dòng)程序,所以,那個(gè)提示你輸入驅(qū)動(dòng)程序的對話框還會(huì)繼續(xù)彈出來,但是USBInstallDriver成功返回的話,其中寫入注冊表的信息是成功寫入了的(如果不成功,也會(huì)繼續(xù)彈出那個(gè)對話框)。
                    在USBInstallDriver函數(shù)調(diào)用完之后,驅(qū)動(dòng)程序dll會(huì)被釋放掉,然后系統(tǒng)再讀取注冊表信息去找匹配的驅(qū)動(dòng)來加載,所以才會(huì)出現(xiàn)上述情況。因此如果你寫入的USB_DRIVER_SETTINGS是和你的設(shè)備匹配的,系統(tǒng)就會(huì)加載你的驅(qū)動(dòng),去繼續(xù)干活了。
                    這次系統(tǒng)加載會(huì)干什么呢?會(huì)調(diào)用驅(qū)動(dòng)DLL中的USBDeviceAttach入口函數(shù)。這個(gè)函數(shù)的學(xué)問就大啦,函數(shù)的聲明如下:
            BOOL USBDeviceAttach(USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs,
                                 LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId,
                                 LPBOOL fAcceptControl,
                                 LPCUSB_DRIVER_SETTINGS lpDriverSettings, DWORD dwUnused)
            lpUsbFuncs是usb的一些函數(shù)接口,定義在USBDI.H頭文件中,大家自己先看看,對照msdn看看。今天只取其中一個(gè)函數(shù)說一下:lpGetDeviceInfo
            在USBDeviceAttach中寫這么一行:
            LPCUSB_DEVICE lpUsbDev = (lpUsbFuncs->lpGetDeviceInfo)(hDevice);
            如果取出的lpUsbDev是NULL的話,那就說明該設(shè)備無法使用,咱們也不用繼續(xù)折騰了,不為空的話,建議大家把這個(gè)lpUsbDev指向的那些數(shù)據(jù)對照msdn搞清楚其含義,這也有助于你理解usb規(guī)范中的一些東西。這個(gè)結(jié)構(gòu)里面套結(jié)構(gòu),套的很深很深,而且我看MSDN2005和我的eVc4中的頭文件中的定義有些地方有出入,大家自己研究一下,捉摸一下吧,結(jié)構(gòu)就對照自己的頭文件中的定義去探索,各成員的含義就對照MSDN去解讀,完成了,差不多就進(jìn)了一大步了
                       馬上要開會(huì),所以今天就寫到這里,大家也可以自己研究研究,然后和我交流,我只覺得一個(gè)人在這黑漆八烏地探索實(shí)在是......要是有個(gè)伴就好了~ :P有個(gè)老師就更爽了~~~


            posted on 2007-04-29 14:22 SuperPlayeR 閱讀(3352) 評論(0)  編輯 收藏 引用 所屬分類: WinCE/Mobile應(yīng)用開發(fā)
            91久久精品视频| 精品久久久久久中文字幕| 亚洲国产香蕉人人爽成AV片久久 | 香蕉99久久国产综合精品宅男自 | 人妻无码久久一区二区三区免费| 国内精品久久久久久久久电影网| 伊人久久大香线蕉亚洲五月天| 久久99精品久久久久子伦| 超级碰久久免费公开视频| 思思久久99热只有频精品66| 人妻无码αv中文字幕久久| 品成人欧美大片久久国产欧美| 久久最新免费视频| 国产亚洲精久久久久久无码| 久久中文字幕无码专区 | 国产成人99久久亚洲综合精品| 久久婷婷色香五月综合激情| 久久91精品久久91综合| 亚洲AV无码久久精品蜜桃| 久久99精品久久久久久野外| 久久久久亚洲AV成人片| 一本久久综合亚洲鲁鲁五月天| 久久精品国产精品国产精品污| 狠狠综合久久综合88亚洲| 狠狠久久综合| 国产成人无码精品久久久免费 | 伊人久久综在合线亚洲2019| 漂亮人妻被黑人久久精品| 久久久久久久免费视频| 美女久久久久久| 欧美一级久久久久久久大| 色偷偷888欧美精品久久久| 国产精品久久久久jk制服| 人妻无码中文久久久久专区| 日韩欧美亚洲综合久久| 久久99热这里只频精品6| 一本大道久久东京热无码AV | 99久久久国产精品免费无卡顿| 亚洲国产精品无码久久一区二区 | 国产精品美女久久久免费| 久久久久免费精品国产|