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 ;
}
目录
相关文章
|
4月前
|
安全 C语言
LabVIEW调用第三方硬件DLL常见问题及开发流程
LabVIEW调用第三方硬件DLL常见问题及开发流程
33 0
|
存储 编译器 API
回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?
回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?
81 0
|
算法 Linux iOS开发
Ios tat 监视I/O子系统
iostat是I/O statistics(输入/输出统计)的缩写,用来动态监视系统的磁盘操作活动。
|
存储 人工智能 JSON
HarmonyOS系统中内核实现智慧烟感控制的方法
大家好,今天主要和大家聊一聊,如何利用鸿蒙系统实现智慧烟感方法
220 0
HarmonyOS系统中内核实现智慧烟感控制的方法
WinCE系统启动时自动运行应用程序之二
Windows CE 4.2平台下创建工程SMDK2440(目录为C:/WINCE420/PUBLIC/SMDK2440)且Build(或者Rebuild)成功;假定需要自动运行的的应用程序为CEDEMO.exe
Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块
这个程序也不怎么复杂,就则一个界面,核心功能呢就是提供反射内存卡和CAN采集卡数据交互,其他的没有了。
140 0
Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块
用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)
以前的IOServer 是用VB6开发,驱动的配置方式和一般的组态软件没有什么很大的区别,配置起来比较麻烦,对一般的生手来说,要费一番功夫才能配置完毕。
698 0