USB设备CreateFile总是返回Invalid Handle

fantasyzhang 2007-06-21 10:16:34
extern "C" {
#include "hidsdi.h"
#include <setupapi.h>
}
#include "stdio.h"
void main()
{
GUID HidGuid;
//1. HidD_GetHidGuid
HidD_GetHidGuid(&HidGuid);
//2. SetupDiGetClassDevs
//The "SetupDiGetClassDevs" function returns the address of an array of structures
//containing information about all attached and enumerated HIDs.
HDEVINFO hDevInfo=SetupDiGetClassDevs (&HidGuid,
NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

SP_DEVICE_INTERFACE_DATA devInfoData;
devInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for(int i=0;;i++){
//3. SetupDiEnumDeviceInterfaces
//The next call is to SetupDiEnumDeviceInterfaces, which retrieves a pointer
//to a structure that identifies an interface in the previously retrieved Device-
//InfoSet array.
BOOLEAN hasMore=SetupDiEnumDeviceInterfaces(hDevInfo,0,&HidGuid,
i,&devInfoData);
if(!hasMore){
printf("No more interfaces can be found!\n");
break;
}
DWORD length;
//4. SetupDiGetDevicelnterfaceDetail
if(!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,NULL,0,&length,NULL)){
printf("GetDeviceInterfaceDetail DataSize failed!This is normal!Error Code is 0x%x\n",GetLastError());
}
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData;
detailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
detailData->cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//5. SetupDiGetDevicelnterfaceDetail
if(!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,detailData,
length,NULL,NULL)){
printf("GetDeviceInterfaceDetail failed!\n");
continue;
}
//6. CreateFile
HANDLE dHwnd = CreateFile(detailData->DevicePath,
GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING, 0, NULL);
if(dHwnd==INVALID_HANDLE_VALUE)
printf("dHwnd is invalid!\n");
// Get Device Attributes
HIDD_ATTRIBUTES dAttrib;
dAttrib.Size = sizeof(dAttrib);
//7. HidD_GetAttributes
if(!HidD_GetAttributes(dHwnd,&dAttrib)){
printf("Get Device Attribute failed!Error Code is 0x%x\n",GetLastError());
}
else
printf("Device vendor ID is 0x%x\n",dAttrib.VendorID);
// Get device PreparsedData
PHIDP_PREPARSED_DATA preparsedData;
if(!HidD_GetPreparsedData(dHwnd,&preparsedData)){
printf("Get PreparsedData failed!\n");
}
CloseHandle(dHwnd);
//HidD_FreePreparsedData(preparsedData);
}
SetupDiDestroyDeviceInfoList(hDevInfo);
}
源代码如上,为什么会这样呢?请前辈们指教???
...全文
738 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
footway 2007-11-08
  • 打赏
  • 举报
回复
http://www.codeguru.com/forum/archive/index.php/t-331907.html
allanzhou9527 2007-09-22
  • 打赏
  • 举报
回复
楼主回答一下自己的问题是如何解决的啊?
我跟你遇上了一样的问题啊
DevicePath是对的
oushengfen 2007-06-22
  • 打赏
  • 举报
回复
m_HANDLE dHwnd= CreateFile(DevInterface.DevicePath(),GENERIC_WRITE |GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
fantasyzhang 2007-06-22
  • 打赏
  • 举报
回复
现在能够获得正确的Handle了,但是只能是GENERIC_WRITE不能为GENERIC_READ!而且现在一调用WriteFile就出错,报告是invalid function!请问这是怎么回事,难道是xp自带的hid驱动不支持WriteFile吗??
yingzi107 2007-06-22
  • 打赏
  • 举报
回复
程序员群 41801837
fantasyzhang 2007-06-21
  • 打赏
  • 举报
回复
我看了一下,DevicePath应该是对的,但是为什么就得不到句饼呢?

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧