WinCE下监视设备插拔的参考代码

简介: 在一些项目中,系统需要实时监测U盘或SD卡的插入拔出。当文件系统加载成功后通知特定应用程序,启动自动播放功能。在U盘或其他外部存储设备移除时,也需要立即通知相应的程序,停止访问这些设备,如播放其中的音视频文件,以免程序出错。

      在一些项目中,系统需要实时监测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 ;
}
目录
相关文章
|
人机交互
操作系统进行设备控制的常见方式
基于上一篇博客,对操作系统进行常见设备控制的方式介绍,并知识拓展。
549 2
操作系统进行设备控制的常见方式
|
存储 Linux Android开发
会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!
会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!
210 0
|
Linux
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
152 0
|
开发工具 内存技术
zynq程序固化补充篇: 不切换启动模式强制烧写
使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)
2327 1
zynq程序固化补充篇: 不切换启动模式强制烧写
|
算法 C语言
嵌入式ARM设计编程(四) ARM启动过程控制
嵌入式ARM设计编程(四) ARM启动过程控制
167 0
嵌入式ARM设计编程(四) ARM启动过程控制
|
传感器
VM系列振弦采集模块如何更新固件获取更多功能
最新固件增加的电子标签,就是智能传感器识别模块,有了这个电子标签,所有的振弦采集仪都直接可以读取传感器的所有信息(传感器型号、量程、K值、编号等,如厂商 品牌: 型号: 类别:应变计 量程:0.000-1500.000uE 编号:206012 线长:2M 线圈:1 初始频率:2102Hz 传感器实时数据:信号幅值00%信号质值00% 数值-18.19uE物理量直接算出, 频率2092.1 频模4376.93 实时 温度 25.2'C 等),再也不用担心传感器上面的纸质标签丢失损毁等,再多的传感器,直接就可以读取出来。用上了就再也回不去了,实在是太方便了。
VM系列振弦采集模块如何更新固件获取更多功能
|
Linux
树莓派内核驱动编写——添加与调用
树莓派内核驱动编写——添加与调用
476 0
WinCE系统启动时自动运行应用程序之二
Windows CE 4.2平台下创建工程SMDK2440(目录为C:/WINCE420/PUBLIC/SMDK2440)且Build(或者Rebuild)成功;假定需要自动运行的的应用程序为CEDEMO.exe
|
Linux
扩展知识点---利用应用程序控制输入设备进行数据显示
扩展知识点---利用应用程序控制输入设备进行数据显示
126 0