wince 事件和消息 处理问题,紧急求助~!!

LINZI   2008-3-4 10:34 楼主
刚学WINCE,遇到一个大难题。
1.驱动程序和应用程序通信,我在网上查了资料,说用得最多的是通过event,但是好像EVENT是用于
同一进程内的线程同步,驱动和应用程序之间怎么用,一直找不到,网上也讲的比较泛,应该不是驱动那边CreateEvent,应用程序WaitSigle..这么简单,希望不吝赐教~~!!感激不尽~!!!

2.就是应用程序A和应用程序B通信,好像通过消息队列通信,但是如果我A程序里面创建消息队列,
B读取消息队列的消息,但是B怎么得到创建消息队列的句柄呢??如果不是这样,应该怎样去设计啊,查了一些资料,好像都没有实列可参考,急~~~

整个WINCE是全内核模式的。应用程序是用EVC4写的。希望能指点,万分感谢~!!!

回复评论 (13)

event分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了。
点赞  2008-3-4 13:46
同意ls。
建议lz看一些“windows核心编程”之类的书。
点赞  2008-3-4 14:09
非常感谢楼上面的朋友~~!!
1.具体来说,就是检测USB是否有插入,如果有,发一个消息或事件给多个应用程序处理,处理完之后再返回消息给驱动。如果采用EVENT交互的,USB驱动里面加一个函数,里面感知USB插入这个事件,如果用CreateEvent,应用程序那边等待waitsignleobect()函数,应该实现不了,毕竟那边应用程序是独立的,和驱动不再一个进程里面,怎么知道是等的那个时间,就是怎么把两边的产生和接受联系起来?按您的意思是不是,createevent的时候给事件命个名,然后等待事件的时候也指明为这个事件,那么就可以了?如果这样就太好了,我再去查查帮助。

2.其实和1是一个问题,只是在驱动和应用程序之间加一个线程,这个线程一直查询USB的状态(因为我不知道当USB插入的时候WINCE到底是获得了什么消息,如果知道的话设计就要简化一些了,只能自己去查询,就是去读相关GPIO的PIN脚),如果发现USB插入该线程再发消息或事件给应用程序。我是新手,没写过类似的程序。

非常感谢大家能回复~~!!!
点赞  2008-3-4 14:21
USB的插入和拔出好象wince自己就能检测,并会给每个app发送消息的。
点赞  2008-3-4 15:02
wince肯定能检测USB的拔插,但我不知道检测到了之后是产生了什么消息,或改变了什么标志,目前只能用去不停的查询PIN脚的这种笨办法。还有APP是我自己写的,用什么函数怎么能收到WINCE自己发的消息呢?
感谢回复的每一个人~!
点赞  2008-3-4 15:13
WM_DEVICECHANGE  
{      
switch  (wParam)  
{  
case  DBT_DEVICEARRIVAL:  //U盘插进来
{

}  
break;  

case  DBT_DEVICEREMOVECOMPLETE:    //U盘拔出
break;  
default:  
break;  
}  
点赞  2008-3-4 16:22
event 是用来进程间通信的,不只进程内
点赞  2008-3-4 21:33
引用: 引用 6 楼 lenux 的回复:
WM_DEVICECHANGE   
{      
switch  (wParam)   
{   
case  DBT_DEVICEARRIVAL:  //U盘插进来  
{  

}   
break;   

case  DBT_DEVICEREMOVECOMPLETE:    //U盘拔出  
break;   
default:   
break;   
}   



DBT_DEVICEARRIVAL 消息会不会只要有设备插上就会触发呢,因为我要区分是我的
移动设备是插上了PC当U盘用,还是,我的移动设备里面插入了SD卡。
点赞  2008-3-5 10:36
引用: 引用 7 楼 nbcool 的回复:
event 是用来进程间通信的,不只进程内


我就是不知道event怎么进程间通信。

因为驱动和应用程序是不同的进程,所以不知道驱动里面能不能识别应用程序创建的事件别呢?如果是USB插入检测的话,那么我的是不是这么操作
在应用程序某处加上:
BOOL CreateThread( NULL, 0, NULL,fun,0 ); //创建线程
.......
fun//线程函数
{
g_event=CreateEvent(0,FALSE,FALSE,eventname);//创建事件
waitforsingleobject(g_event,0xffff);//等待事件被标识
}

然后再USB驱动某处加上
setevent(g_event);//标识事件

但是怎么让驱动里面能识别ge_event呢

感谢回帖的每一个人~!!!
点赞  2008-3-5 10:42
你好好看看CreateEvent的说明。

怎么使用它的第四个参数,eventname

所谓的命名Event和未命名Event的区别。

我觉得1楼已经说的很明白了。
点赞  2008-3-5 12:14
Event是内核对象,即在整个运行的系统中,OS会维护一张内核对象表,这张表在驱动和应用层都可以通过不同的接口来访问,所以通过Event可以实现驱动与应用程序的通信。

不知这样说你是否能理解的更深一些?
点赞  2008-3-5 12:56
这两天根据各位说的再查了一下,终于大概明白了,创建一个同名的事件就可以了,谢谢大家 ~!!
点赞  2008-3-6 13:55
其实你是对Windows 编程完全不了解才有这些问题,和WINCE无关。
点赞  2008-3-10 00:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复