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, 0sizeof(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu命令行登录

网址&#xff1a;http://hi.baidu.com/tingphoon/blog/item/9f03b41c7973a58c86d6b635.html 方法一&#xff1a; 转到kubuntu之前曾经学习了一下&#xff0c;了解到ubuntu在6.10开始用upstart替代init&#xff0c;主要脚本都在/etc/event.d下面&#xff0c;默认情况下/etc下没…

圆桌论坛对话:互联网产业革命

2019独角兽企业重金招聘Python工程师标准>>> 圆桌论坛对话&#xff1a;互联网产业革命 2012年12月18日&#xff0c;2012中国互联网经济论坛即将召开在北京万豪酒店举行。本次大会以“得势者、得天下”为主题&#xff0c;着眼于网络广告与新媒体&#xff0c;深度聚焦…

__va_rounded_size

Linux内核STDarg.h 中 #define __va_rounded_size(TYPE) / (((sizeof (TYPE) sizeof (int) - 1) / sizeof (int)) * sizeof (int)) 求Type 类型所占有的字节数。以int为最小单元&#xff0c;

.net性能测试和优化1 基本概念

软件的性能问题是个绕不开的问题&#xff0c;最近看了这方面的一本书&#xff0c;把主要的内容笔记一下 Performance, load, and stress testing 性能测试 负载测试 压力测试 http://www.51testing.com/?uid-61747-action-viewspace-itemid-3036 性能测试的目的不是去找bugs,而…

Windows PowerShell:(2)基本操作

一、启动PowerShell 2.0 打开“开始”、“所有程序”、“附件”、“Windows PowerShell”程序组&#xff0c;点击“Windows PowerShell”。 二、基本操作 1、查看可用的命令的列表 Get-Command 注&#xff1a;PowerShell有自动补齐命令的功能。例如&#xff0c;在本例中只需要输…

Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6

本文转载自 https://gist.github.com/niranjv/f80fc1f488afc49845e2ff3d5df7f83b 由于Amazon Linux中预装的Python版本为2.7&#xff0c;该脚本教程很好地解决了在Amazon Linux中安装Python3.6的需求&#xff0c;遂转发记录至此 # install pre-requisites sudo yum -y groupins…

怎样从red hat linux图形登录改成从文本登录

修改 /etc/inittab id:5:initdefault: 把 5 改为 3 就是文本方式 需要用vi文件打开才可以保存&#xff01;

sicily 1012. Stacking Cylinders

//纯计算题,三角形内,已知两点坐标A(x1,y1),B(x2,y2)&#xff0c;求第三点的坐标C(x3,y3),其中顶点A,B到C距离都为2//由 (x3-x1)^2(y3-y1)^24 和 (x3-x2)^2(y3-y2)^24 //可得 2(x2-x1)*x32(y2-y1)*y3x2^2-x1^2y2^2-y1^2 (1)//设A,B距离为L,则顶点C到直线AB的距离 H2*sin<CAB…

CMDB小计1

1.web开发&#xff08;Django&#xff0c;flask&#xff0c; tornado&#xff09;。 2.自动化运维&#xff08;CMDB项目&#xff09;。 3.爬虫 和 数据分析。 4.自动化测试。 4.人工智能&#xff0c;机械学习&#xff0c; 算法 CMDB 项目&#xff1a; 自动化运维&#xff1a; 运…

Eclipse搭建Cocos2d-x运行环境问题汇总(不含CygWin)

具体搭建方法&#xff0c;可参阅这两篇文章 http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html http://blog.csdn.net/maojudong/article/details/7261986 首先导入Cocos2d-x下的HelloCpp项目 本文主要记录在配置的过程中遇到的问题及注意事项 问题1.jni/Android…

字符串转换为整数的源码atoi()

#define is_digit(c) ((c) > 0 && (c) < 9) static int skip_atoi(const char **s) { int i0; while (is_digit(**s)) i i*10 *((*s)) - 0; return i; }

Oracle 异常错误处理

本篇主要内容如下&#xff1a;  5.1 异常处理概念  5.1.1 预定义的异常处理  5.1.2 非预定义的异常处理  5.1.3 用户自定义的异常处理  5.1.4 用户定义的异常处理  5.2 异常错误传播  5.2.1 在执行部分引发异常错误  5.2.2 在声明部分引发异常错误  5.3 异常…

mui 获取地图当前位置和经纬度

转&#xff1a;https://blog.csdn.net/qaqqmq/article/details/79151610 希望对大家有用, mui.plusReady(function() { plus.geolocation.getCurrentPosition(MapPoint, function(e) { mui.toast("error:" e.message); }) }) …

宋体配置JAVA j2ee (一) 轻松入门

最近使用开辟的程过中现出了一个小问题&#xff0c;顺便记录一下原因和方法--宋体配置 背景绍介我们经已学习了.NET台平环境下开辟Web目项&#xff0c;经过较长时光接触与学习&#xff0c;慢慢的对于它也熟习了&#xff0c;然而你否是对于Java熟习呢。.NET台平同Java有很多型类…

imgareaselect 缩略图 裁剪图片

(客户端模拟裁剪图片&#xff09; imgareaselect: http://odyniec.net/projects/imgareaselect/ php生成缩略图参考&#xff1a; http://www.php.net/manual/en/book.image.php http://www.webmotionuk.co.uk/php-jquery-image-upload-and-crop/ http://www.leonkessler.com/bl…

token的作用

toke token的作用 使用基于 Token 的身份验证方法&#xff0c;在服务端不需要存储用户的登录记录。大概的流程是这样的&#xff1a; 1. 客户端使用用户名跟密码请求登录。 2.通过ajax向后端发送请求。 3.服务端收到请求&#xff0c;去验证用户名与密码。 4.验证成功后&#xff…

mysql数据的表分区一

当mysql中医个表的总记录数超过了1000W&#xff0c;会出现性能大幅度下降的情况&#xff0c;单性能下降的比率由系统的架构、应用程序、数据库索引、服务器硬件等多种因素而定。数据库多达上亿的数据量&#xff0c;分表之后的单个表 也已经超过了千万&#xff0c;那么单个表的更…

static关键字 void和void指针 函数指针

static关键字1&#xff0e;作用于变量&#xff1a; 用static声明局部变量-------局部变量指在代码块{}内部定义的变量&#xff0c;只在代码块内部有效&#xff08;作用域&#xff09;&#xff0c;其缺省的存储方式是自动变量或说是动态存储的&#xff0c;即指令执行到变量定义…

走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)

题目&#xff1a; 4. 有一段楼梯有6级台阶,规定每一步只能跨一级或两级,要登上第6级台阶有几种不同的走法? 这个题目从数学角度来看可能有一点难度&#xff0c;但一经点破也就没什么难度了。 首先第1级台阶只有一种走法。第2级台阶有两种走法&#xff0c;因为可以直接跨上…

ZOJ-2587 Unique Attack 最小割的唯一性判定

题意&#xff1a;给定一个无向图&#xff0c;要求判定分离两个点的最小割是否唯一。 解法&#xff1a;在求出最大流的基础上&#xff0c;从源点进行一次搜索&#xff0c;搜索按照未饱和的边进行&#xff0c;得到顶点子集S的顶点个数&#xff1b;再从汇点反向搜索未饱和的边&…