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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值