阅读:999回复:3
求救:一个取HANDLE的小程序总是有问题,
GUID HidGuid;
HidD_GetHidGuid(&HidGuid); HDEVINFO hDevInfo; hDevInfo=SetupDiGetClassDevs(&HidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); if (hDevInfo == INVALID_HANDLE_VALUE) { return; } DWORD MemberIndex =0; SP_DEVICE_INTERFACE_DATA devInfoData; devInfoData.cbSize =sizeof(devInfoData); BOOL bSuccess = FALSE; //CString text=\"\"; do { bSuccess =SetupDiEnumDeviceInterfaces (hDevInfo,NULL,&HidGuid,MemberIndex,&devInfoData); if((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS)) { SetupDiDestroyDeviceInfoList(hDevInfo); if(MemberIndex>0) { UpdateData(TRUE); m_status = \"....\"; UpdateData(FALSE); return; } else { UpdateData(TRUE); m_status = .....!\"; UpdateData(FALSE); return; } } else { ULONG Length = 0,Required; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData; SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,NULL,0,&Length,NULL); DWORD dw = GetLastError(); detailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length); detailData ->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); Required = Length; if (0==SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,detailData,Length,NULL,NULL)) { dw = GetLastError(); free(detailData); SetupDiDestroyDeviceInfoList(hDevInfo); return; } HANDLE DeviceHandle =NULL; //add char Path[MAX_PATH]; memset(Path,0,MAX_PATH); strcpy(Path,detailData->DevicePath); strcat(Path,\"PIPE03\"); //add end DeviceHandle =CreateFile(Path,GENERIC_READ|GENERIC_WRITE ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if (DeviceHandle == INVALID_HANDLE_VALUE) { dw = GetLastError(); return; } else { HIDD_ATTRIBUTES Attributes; Attributes.Size = sizeof(Attributes); HidD_GetAttributes(DeviceHandle,&Attributes); UpdateData(TRUE); CString strTemp; strTemp.Format(\"%d\",Attributes.ProductID); m_productid = strTemp; //CStirng strTemp; //int nTemp; //strTmep.format(\"%d\",nTemp); strTemp.Format(\"%d\",Attributes.VendorID); m_vendorid = strTemp; UpdateData(FALSE); PHIDP_PREPARSED_DATA PreparsedData; HidD_GetPreparsedData(DeviceHandle,&PreparsedData); HIDP_CAPS Capabilities; HidP_GetCaps(PreparsedData,&Capabilities); UpdateData(TRUE); strTemp.Format(\"%x\",Capabilities.UsagePage); m_use1 =strTemp; strTemp.Format(\"%x\",Capabilities.Usage); m_use2 =strTemp; UpdateData(FALSE); CloseHandle(DeviceHandle); SetupDiDestroyDeviceInfoList(hDevInfo); HidD_FreePreparsedData(PreparsedData); } } MemberIndex =MemberIndex +1; }while(bSuccess); 大体就是这样的,最开始的时候调用CreateFile中的路径只是采用PSP_DEVICE_INTERFACE_DETAIL_DATA中的路径,不过总是出错.所以看了一下前面的文章,说是需要PIPE号,所以就加了进来,不过还是有问题,请大家帮忙看看,谢谢 |
|
沙发#
发布于:2005-04-02 21:08
你都没有对你需要的设备进行判断,当找到你的设备后应该退出while循环了
|
|
|
板凳#
发布于:2005-04-02 21:23
每当运行时总是出现错误\"5\" Access is denied. ERROR_ACCESS_DENIED
由于CreateFile其他参数都是不变的,所以可能是路径出现了问题,不过检查前边的部分感觉得到的都没问题,另外,我得到的HANDLE是0xffffffff. |
|
地板#
发布于:2005-04-02 21:33
程序是在第一轮就出现的问题,主要就是不能正确取出句柄,另外程序是打算通过判断功能来进行查找的,只是还没有加进去.
|
|