|
紧急求助:USB设备移除后再插上,无法激活!
2、我插上设备,在弹出的提示框中输入驱动程序名称后,能正确安装、调用USBDeviceAttach函数初始化设备了,我在应用程序中用CreateFil
e和DeviceIOControl函数可以访问了,但是当我拔出设备第二次插进去的时候,那个提示框又弹出来要我输入驱动程序名,我跟踪进去发现在
调用USBDeviceAttach函数里的ActivateDevice时失败,无法激活设备!我查了一些资料,说ActivateDevice要调用到流驱动的XXX_Init函数,
必须要在DLL中输出XXX_Init函数并正确执行。这个函数我也写有了,在.def文件中输出了。而且也注册了设备移出时的回调函数,为什么第一
次安装的时候调用ActivateDevice能成功,然后拔出设备再插进去的时候就无法激活了呢?
这个问题卡了我一个星期了还没解决,各位大哥有谁熟悉WinCE下流接口驱动的,请指点一下小弟,非常感激!
chenjiaotou@tom.com
BOOL USBDeviceAttach(USB_HANDLE hDevice,
LPCUSB_FUNCS lpUsbFuncs,
LPCUSB_INTERFACE lpInterface,
LPCWSTR UniqueDriverId,
LPBOOL fAccessContrl,
LPCUSB_DRIVER_SETTINGS lpDriverSettings,
DWORD dwUnused)
{
......
......
__try {
//hStreamDevice就是在Active键下的Hnd键值
pLmeusb->hStreamDevice = ActivateDevice(wsSubClassRegKey, (DWORD)pLmeusb);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pLmeusb->hStreamDevice = 0;
printf("Can't Activate Device! rc=%d\r\n", GetLastError());
}
printf("pLmeusb->hStreamDevice = %d\n", pLmeusb->hStreamDevice); //ok
if (pLmeusb->hStreamDevice) {
//为设备注册一个回调函数, 在设备拔出时由系统回调
if (lpUsbFuncs->lpRegisterNotificationRoutine(hDevice,DeviceNotify,pLmeusb)) {
*fAccessContrl = TRUE; // Accept this device as our own
} else {
MessageBox(NULL, _T("Failed to RegisterNotificationRoutine!"), _T("OK"), MB_OK);
}
} else {
MessageBox(NULL, _T("Can't Activate Device!"), _T("OK"), MB_OK);
}
return TRUE;
}
BOOL WINAPI DeviceNotify(LPVOID lpvNotifyParameter, DWORD dwCode, LPDWORD * dwInfo1, LPDWORD * dwInfo2, LPDWORD * dwInfo3,
LPDWORD * dwInfo4)
{
if (dwCode == USB_CLOSE_DEVICE) {
//清理占用的资源
//取得驱动程序指针
PLMEUSB_CONTEXT pLmeusb = (PLMEUSB_CONTEXT)lpvNotifyParameter;
if(!DeactivateDevice(pLmeusb->hStreamDevice)) {
MessageBox(NULL, _T("DeactivateDevice error"), _T("OK"), MB_OK);
}
Sleep(1000);
PDEVICECONTEXT pPDD = (PDEVICECONTEXT)pLmeusb->dwDeviceContext;
//先释放设备上下文
LocalFree(pPDD->usbVideoIF);
LocalFree(pPDD);
//再释放驱动程序
LocalFree(pLmeusb);
return TRUE;
}
return FALSE;
}
|
|