WinCE驅(qū)動(dòng)開發(fā)流程_第1頁
WinCE驅(qū)動(dòng)開發(fā)流程_第2頁
WinCE驅(qū)動(dòng)開發(fā)流程_第3頁
WinCE驅(qū)動(dòng)開發(fā)流程_第4頁
WinCE驅(qū)動(dòng)開發(fā)流程_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

wince驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記嵌入式技術(shù)/walking_man發(fā)表于2007-03-20,20:03首先是wince驅(qū)動(dòng)的分類問題。按照書上講的說CE下驅(qū)動(dòng)分成單體驅(qū)動(dòng)和分層驅(qū)動(dòng),而看到另一種說法是本機(jī)驅(qū)動(dòng)和流式驅(qū)動(dòng)。經(jīng)過microsun大哥的指點(diǎn),把這兩種分類法分開了。在這里引用一下:“單體與分層只是從代碼的形式上做的分類?分層驅(qū)動(dòng)代碼上分為PDD與MDD,—般的微軟已經(jīng)實(shí)現(xiàn)了MDD,可能也實(shí)現(xiàn)了PDD,我們只需要對(duì)PDD做些修改就能使用,比如音頻的驅(qū)動(dòng),顯示的驅(qū)動(dòng)。單層驅(qū)動(dòng)是把PDD與MDD寫在一起,沒有做嚴(yán)格的區(qū)分,通常這種驅(qū)動(dòng)比較簡(jiǎn)單,比如:ATADISK。至于本地驅(qū)動(dòng)和流式驅(qū)動(dòng)是從驅(qū)動(dòng)與系統(tǒng)其它模塊(調(diào)用者)的接口形式上做的分類?其實(shí),本地驅(qū)動(dòng)這個(gè)名稱不大恰當(dāng),可能叫專用驅(qū)動(dòng)或其它名字更為合適?它是指調(diào)用它的模塊給它有特定的接口,比如電源驅(qū)動(dòng)和通用LED驅(qū)動(dòng)。而串口,網(wǎng)卡等就是流接口驅(qū)動(dòng)程序.所以,一個(gè)驅(qū)動(dòng)程序可以是單體的流式驅(qū)動(dòng),例如:ATADISK.也可以是分層的流式:如OHCI”按照我的理解,單體和分層是驅(qū)動(dòng)實(shí)現(xiàn)方式上的分類,而本地和流式則是驅(qū)動(dòng)模型上的分類,所謂本地驅(qū)動(dòng)就是操作系統(tǒng)有保留專門的接口,所謂流式是指編寫的DLL文件里可以導(dǎo)出各種流式接口函數(shù)。第二點(diǎn):驅(qū)動(dòng)的功能屬性。設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和硬件的接口,操作系統(tǒng)定義了一組標(biāo)準(zhǔn)的接口,編寫驅(qū)動(dòng)的過程也就是實(shí)現(xiàn)這些接口。從應(yīng)用程序到具體硬件間有如下這些環(huán)節(jié)起作用:應(yīng)用程序-調(diào)用OS函數(shù)-操作系統(tǒng)-驅(qū)動(dòng)接口-驅(qū)動(dòng)程序-硬件操作函數(shù)-硬件。在wince里驅(qū)動(dòng)都以用戶態(tài)的DLL存在,需要通過進(jìn)程加載到slot里。共有三類系統(tǒng)進(jìn)程用來加載:Device.exe,GWES.exe,FileSys.exe.絕大多數(shù)設(shè)備驅(qū)動(dòng)都是通過Device.exe加載的。需要注意的是,不同的OS保留的設(shè)備驅(qū)動(dòng)接口是不一樣的,如桌面windows和wince就不同。第三點(diǎn):wince下設(shè)備的初始化分為兩個(gè)階段:Device.exe的初始化;外設(shè)的枚舉和加載。其流程是:上電-啟動(dòng)bootloader-啟動(dòng)NK-啟動(dòng)注冊(cè)表init鍵(Device.exe啟動(dòng))-初始化數(shù)據(jù)結(jié)構(gòu),I/O,電源管理等-加載BusEnum.dll(總線枚舉器)-枚舉注冊(cè)表下Driver/buildin的所有子鍵。這里的枚舉過程就是循環(huán)調(diào)用 ActivateDeviceEx()函數(shù)加載驅(qū)動(dòng)的過程。在OS啟動(dòng)完畢后,我們可以用PB的RemoteRegistryTool查看H_L_M/drivers/active包含的子鍵,看哪些驅(qū)動(dòng)隨啟動(dòng)而加載。第四點(diǎn):流接口驅(qū)動(dòng)的概念。暴露流式接口函數(shù)的驅(qū)動(dòng)即是流驅(qū)動(dòng),它把外設(shè)抽象成一個(gè)文件。過程是:應(yīng)用程序使用文件 API對(duì)設(shè)備進(jìn)行訪問,OS接受API調(diào)用FileSys.exe,轉(zhuǎn)到device.exe,調(diào)用流接口,與硬件交互。所謂流接口函數(shù)有十個(gè),包括 XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、XXX_IOControl,在wince5.0中增加le了XXX_PreClose,XXX_PreDeinit.而我們?cè)趹?yīng)用程序里對(duì)應(yīng)的文件API有CreateFile、DeviceloControl、ReadFile、WriteFile,CloseHandle,SetFilePointer.第五點(diǎn):編寫流驅(qū)動(dòng)的步驟。有兩種實(shí)現(xiàn)途徑:1。寫DLL,做成Project,加入到OS里。2。改BSP,把驅(qū)動(dòng)寫在BSP里,再選擇那個(gè)BSP做OS。第一種方法步驟是在PB中新建一個(gè)DLL項(xiàng)目,編寫一些輸入函數(shù),寄存器,外設(shè)的聲明,寫DLLENTRY函數(shù);實(shí)現(xiàn)流接口函數(shù);編寫DLL的導(dǎo)出函數(shù)文件.DEF;為驅(qū)動(dòng)程序?qū)懭胱?cè)表項(xiàng),還需要修改bib文件。 第二種方法就是在platform/BSP/drivers下新建一個(gè)目錄,然后在drivers目錄中的dirs文件中加入新建的目錄名。在新建的目錄下,新建你的源代碼文件,在其中實(shí)現(xiàn)DLL函數(shù)。新建名稱分別為sources,makefile,***.def的文件;修改platform.reg和platform.bib文件。幾個(gè)小知識(shí)點(diǎn):(1)應(yīng)用程序可以通過ActivateDeviceEx()加載設(shè)備驅(qū)動(dòng);(2)注冊(cè)表里的設(shè)備前綴Prefix項(xiàng)應(yīng)該用三個(gè)字母表示,驅(qū)動(dòng)的索引是Index.如果應(yīng)用程序用CreateFile()來打開驅(qū)動(dòng)程序時(shí),第一個(gè)參數(shù)應(yīng)該是這個(gè)Prefix項(xiàng)加上Index的值。(3)驅(qū)動(dòng)程序中要用DMA,需要為其保留一段物理空間,就要修改config.bib給驅(qū)動(dòng)程序共享數(shù)據(jù)用。(4)查看驅(qū)動(dòng)是否加載,可以用遠(yuǎn)程工具看注冊(cè)表 buildin/active鍵,或者是看device.exe的進(jìn)程是否包含DLL文件。(5)DLL的入口函數(shù)名稱默認(rèn)是DllMain,但我們可以改成別的名稱,在SOURCES文件中加入這樣一行,DLLENTRY=ABCD入口函數(shù)就被改成了ABCD,我們就應(yīng)該實(shí)現(xiàn)名為ABCD的函數(shù).(6)感覺寫驅(qū)動(dòng)無從下手的時(shí)候,可以嘗試看現(xiàn)有的代碼與平臺(tái)無關(guān)驅(qū)動(dòng)源碼位于public\common\OAK\Drivers與平臺(tái)相關(guān)驅(qū)動(dòng)platform\{bsp}\srv\Drivers基礎(chǔ)知識(shí):1) 系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件細(xì)節(jié),在應(yīng)用程序看來硬件只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)是內(nèi)核的一部分。2) 驅(qū)動(dòng)程序完成以下功能:——對(duì)設(shè)備初始化和釋放;——把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);——讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);——檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。3) 上層應(yīng)用程序運(yùn)行在用戶模式(非特權(quán)模式,Ring3),代碼被嚴(yán)格約束執(zhí)行。如不能執(zhí)行硬件IO指令。所有的這些被阻止的操作如果想運(yùn)行必須通過陷阱門來請(qǐng)求操作系統(tǒng)內(nèi)核。4)操作系統(tǒng)內(nèi)核運(yùn)行在內(nèi)核模式(特權(quán)模式,Ring0),可以執(zhí)行所有有效的CPU指令。包括10操作,可訪問任何內(nèi)存區(qū)。5) 整個(gè)硬件系統(tǒng)資源在驅(qū)動(dòng)程序面前是赤裸裸的,驅(qū)動(dòng)可以使用所有系統(tǒng)資源,編寫驅(qū)動(dòng)程序時(shí)我們必須格外小心驅(qū)動(dòng)代碼的邊界條件,確保它們不會(huì)損壞整個(gè)操作系統(tǒng)。2、 Windows支持的驅(qū)動(dòng):1) 虛擬設(shè)備驅(qū)動(dòng)程序(VirtualDeviceDriver):Windows3.1(Windows95/98/Me)2) 內(nèi)核模式驅(qū)動(dòng)程序(KernelModeDriver):WindowsNT3) Win32驅(qū)動(dòng)程序模型(Win32DriverMode):從Windows98開始使用。其中WDM是目前主流,然而在WinCE系統(tǒng)中,由于硬件資源有限和嵌入式系統(tǒng)的特點(diǎn),對(duì)其的支持非常有限。3、 WinCE系統(tǒng)驅(qū)動(dòng)簡(jiǎn)介:1)WinCE畢竟是一個(gè)嵌入式系統(tǒng),有其自身的特殊性,為了提高運(yùn)行效率,所有驅(qū)動(dòng)皆為動(dòng)態(tài)鏈接庫,驅(qū)動(dòng)實(shí)現(xiàn)中可以調(diào)用所有標(biāo)準(zhǔn)的API。而在其他Windows系統(tǒng)中可能的驅(qū)動(dòng)文件還有.vxd,.sys和動(dòng)態(tài)鏈接庫。2)WinCE驅(qū)動(dòng)從結(jié)構(gòu)上講分為本地驅(qū)動(dòng)(NativeDriver)和流接口驅(qū)動(dòng)(StreamDriver)。——本地驅(qū)動(dòng)主要用于低級(jí)、內(nèi)置的設(shè)備。實(shí)現(xiàn)它們的接口并不統(tǒng)一,而是針對(duì)不同類型的設(shè)備相應(yīng)設(shè)計(jì)。因此開發(fā)過程相對(duì)復(fù)雜,沒有固定的模式,一般做法是通過移植、定制現(xiàn)有的驅(qū)動(dòng)樣例來實(shí)現(xiàn)。 流接口驅(qū)動(dòng)是最基本的一種驅(qū)動(dòng)結(jié)構(gòu),它的接口是一組固定的流接口函數(shù),具有很咼的通用性,WinCE的所有驅(qū)動(dòng)程序都可以通過這種方式來實(shí)現(xiàn)。流接口驅(qū)動(dòng)程序通過文件系統(tǒng)調(diào)用從設(shè)備管理器和應(yīng)用程序接收命令。該驅(qū)動(dòng)程序封裝了將這些命令轉(zhuǎn)換為它所控制的設(shè)備上的適當(dāng)操作所需的全部信息。流接口驅(qū)動(dòng)是動(dòng)態(tài)鏈接庫,由一個(gè)叫做設(shè)備管理程序的特殊應(yīng)用程序加載、管理和卸載。與本地驅(qū)動(dòng)程序相比,所有流接口驅(qū)動(dòng)程序使用同一組接口函數(shù)集,包括實(shí)現(xiàn)函數(shù):XXX_lnit、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、XXX_IOControl,這些函數(shù)與硬件打交道。用戶函數(shù):CreateFile、DeviceloControl、ReadFile、WriteFile,這些函數(shù)方便用戶使用驅(qū)動(dòng)程序。3)WinCE下驅(qū)動(dòng)的加載方式: 通過GWES(Graphics,Windowing,andEventsSubsystem):主要加載與顯示和輸入有關(guān)的驅(qū)動(dòng),如鼠標(biāo)、鍵盤驅(qū)動(dòng)等。這些驅(qū)動(dòng)一般為本地驅(qū)動(dòng)?!ㄟ^設(shè)備管理器:兩種結(jié)構(gòu)的驅(qū)動(dòng)都加載,加載的本地驅(qū)動(dòng)主要由PCMCIAHostController,USBHostControllerdriver,主要是總線類的驅(qū)動(dòng);流接口驅(qū)動(dòng)主要有音頻驅(qū)動(dòng),串并口驅(qū)動(dòng)。 動(dòng)態(tài)加載:前兩者都是系統(tǒng)啟動(dòng)時(shí)加載的,動(dòng)態(tài)加載則允許設(shè)備掛載上系統(tǒng)時(shí)將驅(qū)動(dòng)調(diào)入內(nèi)核,主要有外接板卡驅(qū)動(dòng),USB設(shè)備驅(qū)動(dòng)等。4、流接口驅(qū)動(dòng)函數(shù)介紹:1)DWORDXXX_lnit(LPCTSTRpContext,LPCVOIDIpvBusContext);pContext:指向一個(gè)字符串,包含注冊(cè)表中該流接口活動(dòng)鍵值的路徑lpvBusContext:該函數(shù)是驅(qū)動(dòng)掛載后第一個(gè)被執(zhí)行的。主要負(fù)責(zé)完成對(duì)設(shè)備的初始化操作和驅(qū)動(dòng)的安全性檢查。由ActiveDeviceEx通過設(shè)備管理器調(diào)用。其返回值一般是一個(gè)數(shù)據(jù)結(jié)構(gòu)指針,作為函數(shù)參數(shù)傳遞給其他流接口函數(shù)。BOOLXXX_Deinit(DWORDhDeviceContext);hDeviceContext:XXX_Init的返回值。整個(gè)驅(qū)動(dòng)中最后執(zhí)行。用來停止和卸載設(shè)備。由DeactivateDevice觸發(fā)設(shè)備管理器調(diào)用。成功返回TRUE。DWORDXXX_Open(DWORDhDeviceContext,DWORDAccessCode, DWORDShareMode);hDeviceContext:XXX_Init的返回值。AccessCode:訪問模式標(biāo)志,讀、寫或其他。ShareMode:驅(qū)動(dòng)的共享方式標(biāo)志。打開設(shè)備,為后面的操作初始化數(shù)據(jù)就夠,準(zhǔn)備相應(yīng)的資源。應(yīng)用程序通過CreateFile函數(shù)間接調(diào)用之。返回一個(gè)結(jié)構(gòu)指針,用于區(qū)分哪個(gè)應(yīng)用程序調(diào)用了驅(qū)動(dòng),這個(gè)值還作為參數(shù)傳遞給其他接口函數(shù)XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl。BOOLXXX_Close(DWORDhOpenContext);hOpenContext:XXX_Open返回值。關(guān)閉設(shè)備,釋放資源。由CloseHandle函數(shù)間接調(diào)用。DWORDXXX_Read(DWORDhOpenContext,LPVOIDpBuffer,DWORDCount);hOpenContext:XXX_Open返回值。pBuffer:緩沖區(qū)指針,接收數(shù)據(jù)。Count:緩沖區(qū)長度。由ReadFile函數(shù)間接調(diào)用,用來讀取設(shè)備上的數(shù)據(jù)。返回讀取的實(shí)際數(shù)據(jù)字節(jié)數(shù)。DWORDXXX_Write(DWORDhOpenContext,LPCVOIDpBuffer,DWORDCount);hOpenContext:XXX_Open返回值。pBuffer:緩沖區(qū)指針,接收數(shù)據(jù)。Count:緩沖區(qū)長度。由WriteFile函數(shù)間接調(diào)用,把數(shù)據(jù)寫到設(shè)備上,返回實(shí)際寫入的數(shù)據(jù)數(shù)。BOOLXXX_IOControl(DWORDhOpenContext,DWORDdwCode,PBYTEpBufIn,DWORDdwLenIn,PBYTEpBufOut,DWORDdwLenOut,PDWORDpdwActualOut);hOpenContext:XXX_Open返回值。dwCode:控制命令字。pdwActualOut:實(shí)際輸出數(shù)據(jù)長度。用于向設(shè)備發(fā)送命令,應(yīng)用程序通過DeviceIoControl調(diào)用來實(shí)現(xiàn)該功能。要調(diào)用這個(gè)接口還需要在應(yīng)用層和驅(qū)動(dòng)之間建立一套相同的命令,通過宏定義CTL_CODE(DeviceType,Function,Method,Access來實(shí)現(xiàn)。如:#defineIOCTL_INIT_PORTS/CTL_CODE(FILE_DEVICE_UNKNOWN,OX8O1,METHOD_BUFFERED,FILE_ANY_ACCESS)voidXXX_PowerDown(DWORDhDeviceContext);hDeviceContext:XXX_Init的返回值。負(fù)責(zé)設(shè)備的上電控制。voidXXX_PowerUp(DWORDhDeviceContext);hDeviceContext:XXX_Init的返回值。負(fù)責(zé)設(shè)備的斷電控制DWORDIOC_Seek(DWORDhOpenContext,longAmount,WORDType)hOpenContext:XXX_Open返回值。Amount:指針的偏移量。Type:指針的偏移方式。將設(shè)備的數(shù)據(jù)指針指向特定的位置,應(yīng)用程序通過SetFilePointer函數(shù)間接調(diào)用。不是所有設(shè)備的屬性上都支持這項(xiàng)功能。5、流接口驅(qū)動(dòng)的加載和注冊(cè)表設(shè)置:系統(tǒng)啟動(dòng)時(shí)啟動(dòng)設(shè)備管理程序,設(shè)備管理程序讀取HKEY_LOCAL_MACHINE/Drivers/Builtln鍵的內(nèi)容并加載已列出的流接口驅(qū)動(dòng)程序。因此注冊(cè)表對(duì)于驅(qū)動(dòng)的加載有著關(guān)鍵作用。下面是一個(gè)例子:【HKEY_LOCAL_MACHINE/Drivers/Builtl/IOControler】"Prefix”=”XXX”"Dll"="drivername.dll"其中,"Prefix"="XXX”中的XXX要和XXX_lnit等函數(shù)中的一樣。CreateFile創(chuàng)建的驅(qū)動(dòng)名前綴也必須和它們一致。6、驅(qū)動(dòng)程序的編寫、編譯及其相關(guān)目錄、配置文件的格式和修改:1) 首先必須在PB相應(yīng)平臺(tái)的的driver目錄下建立要?jiǎng)?chuàng)建的驅(qū)動(dòng)所在的目錄。如在x:/Wince420/platform/smdk2410/drivers目錄下建立一個(gè)lOCtrol目錄。2) 修改Drivers目錄下的dirs文件。3) 創(chuàng)建驅(qū)動(dòng)源文件XXX.c,在該文件中實(shí)現(xiàn)上述流接口函數(shù)。并且加入DLL入口函數(shù):BOOLDllEntry(HINSTANCEhinstDll,/*@parmInstancepointer.*/DWORDdwReason,/*@parmReasonroutineiscalled.*/LPVOIDlpReserved/*@parmsystemparameter.*/)4) 創(chuàng)建Makefile和Sources和.def文件,控制編譯。5) 使用CECEditor修改cec文件,編譯添加的新特性。6) 復(fù)制新生成的4個(gè)文件到Release目錄下,修改注冊(cè)表文件platform.reg和platform.bib文件。7) MakeImage。8) DownLoadImage一般我們?cè)隍?qū)動(dòng)程序中需用LocalAlloc保留一塊存儲(chǔ)空間,然后用LocalCopy將I/O端口映射到該地址上,以后就可以訪問該保留下來的地址了。而對(duì)中斷的處理各種設(shè)備不盡相同。如果是一個(gè)內(nèi)置設(shè)備(BuiltIn),一般在oalintr.h文件中定義一個(gè)新的中斷,OAL層中加上對(duì)該中斷的處理。然后在驅(qū)動(dòng)程序的Init函數(shù)中用CreateEvent創(chuàng)建一個(gè)事件,調(diào)用InterruptInitialize將定義好的中斷與創(chuàng)建的事件相關(guān)聯(lián),再創(chuàng)建一個(gè)線程,在該線程中調(diào)用WaitforSingleObject等待該事件,當(dāng)該設(shè)備有中斷發(fā)生時(shí),這個(gè)事件就被觸發(fā),WaitforSingleOjbect返回,線程被運(yùn)行,我們就可以處理該中斷。OAL中所新加的對(duì)該中斷的處理就是所謂的ISR之內(nèi)容,而這個(gè)線程就是所說的1ST。其它1.CE下同名設(shè)備不能大于10CE5.0中已經(jīng)沒有這個(gè)問題了,以前的版本可以這樣做:只給上層輸出一個(gè)設(shè)備,然后用一個(gè)IOCTL去打開一個(gè)個(gè)的物理設(shè)備這樣就可以做到不受任何限制了2.MDD與PDD一個(gè)驅(qū)動(dòng)程序通常會(huì)被分成硬件相關(guān)(PDD)與硬件無關(guān)(MDD)層兩部分。當(dāng)然,這種分層不是必須的,只是采用這種分層以后可以少寫很多代碼,因?yàn)槲④浱峁┝撕芏囹?qū)動(dòng)程序的MDD。即使CE中沒有我們所寫的驅(qū)動(dòng)程序的樣例,采用這種結(jié)構(gòu)以后,當(dāng)需要寫第二個(gè)程序時(shí),就可以重用它的代碼,就可以提高開發(fā)效率。MDD是提供同類型的設(shè)備(比如串口)都會(huì)有的功能,這樣PDD基本上就只有寄存器操作了。像串口的中斷處理,Read/Write函數(shù),其大部分代碼都是在MDD中實(shí)現(xiàn)的,不同的串口實(shí)現(xiàn)中只需要提供一些實(shí)際操作寄存器的函數(shù)不同的驅(qū)動(dòng)程序,其MDD與PDD的接口不盡相同,所以,當(dāng)我們面對(duì)一個(gè)具體的驅(qū)動(dòng)程序時(shí),需要查幫助弄清楚需要提供哪些函數(shù)3XXX_lnit函數(shù)的返回句柄通常,這個(gè)句柄是驅(qū)動(dòng)程序自己保存數(shù)據(jù)的一個(gè)指針,我們?cè)贗nit返回時(shí)告訴上層程序,以后上層調(diào)用其它函數(shù)(例如Open)時(shí),會(huì)將這個(gè)值傳入,這樣,我們就可以訪問自己的一些私有數(shù)據(jù)。當(dāng)然,也可以返回一個(gè)任意的非0值對(duì)于一個(gè)設(shè)備驅(qū)動(dòng)程序,系統(tǒng)不用的層會(huì)有不同的句柄。我們?cè)赬XX_Init中返回的句柄保存在設(shè)備管理器中,別的程序中應(yīng)該是看不到的,而用CreateFile也會(huì)得到一個(gè)文件句柄,這個(gè)保存在哪我不知道,但和前者是不一樣的。也就是說不同層的軟件所關(guān)心的句柄也會(huì)不一樣

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論