apince如何在wince 6.0中捕获驱动程序设置的事件?

时间:2011-05-18 12:53:18

标签: windows-ce

我有wince 6.0 applcaion,其中内部线程applcation正在等待驱动程序将设置的事件。我在applcation中创建了事件,在驱动程序中也创建了同样的事件。但是当驱动程序设置事件然后appcation无法捕获它。(驱动程序正在成功设置事件)

这是代码

// application side
m_hEvent = CreateEvent(NULL,FALSE,FALSE,L"MY_EVENT");
if(m_hEvent)
{
    if(!DeviceIoControl(m_hDriver,CREATE_MY_EVENT,
        (LPDWORD)&m_hEvent,NULL,NULL,NULL,NULL,NULL))
    {
        AfxMessageBox(L"not created event successfully in driver");
    }
    while(TRUE)
    {
        //waiting for driver to setevent
        int RetValue = WaitForSingleObject(m_hEvent,INFINITE);
        if(0 == RetValue )
        {
            AfxMessageBox(L"wait end");
        }
        else
        {
            AfxMessageBox(L"time out");
        }
    }
}

...

//Driver side
BOOL SMP_IOControl(DWORD hOpenContext, DWORD dwCode, 
                   LPDWORD pBufIn, DWORD dwLenIn, LPDWORD pBufOut, 
                   DWORD dwLenOut, PDWORD pdwActualOut)
{
    switch (dwCode)
    {
         case CREATE_MY_EVENT :
         {
             m_hEvent = (HANDLE)(*pBufIn);
             if(NULL != m_hEvent)
             {
                 // getting this message
                 MessageBox(NULL,L"event successfully created",L"success",MB_OK); 
             }
             else
             {
                 MessageBox(NULL,L"no event successfully created",L"success",MB_OK);
             }
         }
         break;
         case SET_EVENT:
         {
             //set event that which application waiting
             if(SetEvent(m_hEvent))
             {
                 // getting this message
                 MessageBox(NULL,L"event set successfully",L"success",MB_OK); 
             }
             else
             {
                 MessageBox(NULL,L"event set successfully",L"success",MB_OK);
             }
         }
         break;
     }
}

1 个答案:

答案 0 :(得分:3)

这里固有的问题是你有一个进程(你的应用程序)创建一个HANDLE然后将该HANDLE传递给另一个进程(device.exe)并期望它有效。不是。

在这种情况下,解决方案很简单。系统事件在操作系统中按名称是唯一的,因此只需使用相同的文本名称在两个地方中调用CreateEvent即可。当您在一个进程中调用SetEvent时,等待其创建的HANDLE的另一个进程将发出信号。

这意味着删除你的CREATE_MY_EVENT IOCTL(这是一个非标准的命名约定,BTW,它应该以“IOCTL_”开头)处理驱动程序,只需在CreateEvent方法中调用SMP_Init即可存放HANDLE。