我有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;
}
}
答案 0 :(得分:3)
这里固有的问题是你有一个进程(你的应用程序)创建一个HANDLE然后将该HANDLE传递给另一个进程(device.exe)并期望它有效。不是。
在这种情况下,解决方案很简单。系统事件在操作系统中按名称是唯一的,因此只需使用相同的文本名称在两个地方中调用CreateEvent
即可。当您在一个进程中调用SetEvent
时,等待其创建的HANDLE的另一个进程将发出信号。
这意味着删除你的CREATE_MY_EVENT IOCTL(这是一个非标准的命名约定,BTW,它应该以“IOCTL_”开头)处理驱动程序,只需在CreateEvent
方法中调用SMP_Init
即可存放HANDLE。