WinCE下监视设备插拔的参考代码
生活随笔
收集整理的這篇文章主要介紹了
WinCE下监视设备插拔的参考代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? 在一些項目中,系統需要實時監測U盤或SD卡的插入拔出。當文件系統加載成功后通知特定應用程序,啟動自動播放功能。在U盤或其他外部存儲設備移除時,也需要立即通知相應的程序,停止訪問這些設備,如播放其中的音視頻文件,以免程序出錯。
????? 我們可以使用WinCE設備管理器提供的Device Interface Notification來實現這個功能,參考代碼如下。
DWORD?WINAPI?ThreadFun(LPVOID?lpParameter){
????HANDLE?ph[MAXIMUM_WAIT_OBJECTS];
????HANDLE?phMsgQueue[MAXIMUM_WAIT_OBJECTS-1];
????HANDLE?phDevNotif[MAXIMUM_WAIT_OBJECTS-1];
????MSGQUEUEOPTIONS?msgopts;
????GUID?guid[]?=?{BLOCK_DRIVER_GUID,?FSD_MOUNT_GUID};
????DWORD?dwCount;
????BYTE?pDevBuf[sizeof(DEVDETAIL)?+?MAX_DEVCLASS_NAMELEN?*?sizeof(TCHAR)]?=?{0};
????DEVDETAIL?*pd?=?(DEVDETAIL*)pDevBuf;
????ghExitThread?=?CreateEvent(NULL,?FALSE,?FALSE,?NULL);
????ph[0]?=?ghExitThread;
????dwCount?=?sizeof(guid)/sizeof(GUID);
????for?(DWORD?i?=?0;?i?<?dwCount;?i++)
????{
????????memset(&msgopts,?0,?sizeof(msgopts));
????????msgopts.dwFlags?=?0;
????????msgopts.dwSize?=?sizeof(msgopts);
????????msgopts.dwMaxMessages?=?0;?
????????msgopts.cbMaxMessage?=?sizeof(pDevBuf);
????????msgopts.bReadAccess?=?TRUE;
????????phMsgQueue[i]?=?CreateMsgQueue(NULL,?&msgopts);
????????phDevNotif[i]?=?RequestDeviceNotifications(guid+i,?phMsgQueue[i],?TRUE);
????????
????????ph[i+1]?=?phMsgQueue[i];
????}
????while?(1)
????{
????????DWORD?dwSize;
????????DWORD?dwFlags;
????????DWORD?dwWait;
????????DWORD?dwQueue;
????
????????dwWait?=?WaitForMultipleObjects(dwCount?+?1,?ph,?FALSE,?INFINITE);
????????if?((dwWait?<=?WAIT_OBJECT_0)?||?(dwWait?>=?(WAIT_OBJECT_0?+?dwCount?+?1)))?
????????{
????????????break;
????????}
????????dwQueue?=?(dwWait?-?WAIT_OBJECT_0)?-?1;
????????
????????while(ReadMsgQueue(phMsgQueue[dwQueue],?pd,?sizeof(pDevBuf),?&dwSize,?1,?&dwFlags))?
????????{
????????????if?(GUID_ISEQUAL(pd->guidDevClass,?BLOCK_DRIVER_GUID))
????????????{
????????????????printf("\r\nDEV:%S?%s",?pd->szName,?pd->fAttached???"Add!"?:?"Removed!");
????????????????if?(pd->fAttached)
????????????????{
????????????????????Sleep(10);
????????????????????printf("\r\nOpenStore!");
????????????????????HANDLE?h?=?OpenStore(pd->szName);
????????????????????STOREINFO?si;
????????????????????memset(&si,?0?,?sizeof(si));
????????????????????si.cbSize?=?sizeof(si);
????????????????????printf("\r\nGetStoreInfo!");
????????????????????GetStoreInfo(h,?&si);
????????????????????printf("\r\n%S?%x",?si.szStoreName,?si.dwDeviceType);
????????????????????CloseHandle(h);
????????????????}
????????????}
????????????else?if(GUID_ISEQUAL(pd->guidDevClass,?FSD_MOUNT_GUID))
????????????{
????????????????printf("\r\nFSD:%S?%s",?pd->szName,?pd->fAttached???"Add!"?:?"Removed!");
????????????}
????????????Sleep(1);
????????}????????
????}
????
????for?(DWORD?i?=?0;?i?<?dwCount;?i++)?
????{
????????StopDeviceNotifications(phDevNotif[i]);
????????CloseMsgQueue(phMsgQueue[i]);
????}????
????CloseHandle(ghExitThread);
????return?0;
}
轉載于:https://www.cnblogs.com/we-hjb/archive/2011/06/28/2092779.html
總結
以上是生活随笔為你收集整理的WinCE下监视设备插拔的参考代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea 无法打开项目_Premiere
- 下一篇: 系统动力学9种模型_软工国际标准专栏(9