开发USB HID的源码,调用SetupDiGetDeviceInterfaceDetail出错?

keri_syml 2013-06-03 02:53:04
调用第一次SetupDiGetDeviceInterfaceDetail出错,返回122.这没有问题.可是为何第二次调用怎么还是出现1784-提供给请求操作的用户缓冲区无效呢.
我网上查阅的大量例子,发现我的程序是没有问题的啊,请高手帮忙看一下呢


private: // User declarations

DWORD ActualBytesRead;
DWORD BytesRead;
HIDP_CAPS Capabilities;
DWORD cbBytesRead;
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData;
HANDLE DeviceHandle;
DWORD dwError;
HANDLE hEventObject;
HANDLE hDevInfo;
GUID HidGuid;
OVERLAPPED HIDOverlapped;
ULONG Length;
DWORD RequiredSize; //add
LPOVERLAPPED lpOverLap;
bool MyDeviceDetected;
AnsiString MyDevicePathName;
DWORD NumberOfBytesRead;
HANDLE ReadHandle;
DWORD ReportType;
ULONG Required;
AnsiString ValueToDisplay;
HANDLE WriteHandle;
char InputReport[256];
char OutputReport[256];

boolean TUSBHID::HidUsb_Conn(int VendorID,int ProductID)
{
HIDD_ATTRIBUTES Attributes;
// DWORD DeviceUsage;
SP_DEVICE_INTERFACE_DATA devInfoData;
bool LastDevice = FALSE;
int MemberIndex = 0;
LONG Result;


char Buffer[256];

memset(Buffer,0,sizeof(Buffer));
memset(ManufacturerString,0,sizeof(ManufacturerString));
memset(ProductString,0,sizeof(ProductString));

Length = 0;
detailData = NULL;
DeviceHandle=NULL;

//获取HID GUID
HidD_GetHidGuid(&HidGuid);
//获取指定类的设备
hDevInfo=SetupDiGetClassDevs
(&HidGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);

devInfoData.cbSize = sizeof(devInfoData);

MemberIndex = 0;
LastDevice = FALSE;

do
{
Result=SetupDiEnumDeviceInterfaces
(hDevInfo,
0,
&HidGuid,
MemberIndex,
&devInfoData);

if (Result != 0)
{
Result = SetupDiGetDeviceInterfaceDetail
(hDevInfo,
&devInfoData,
NULL,
0,
&RequiredSize,//&Length,
NULL);
if (!Result) {
//得到错误代码
DWORD dwError = GetLastError();
*/
}

detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);//Length);

detailData -> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
Result = SetupDiGetDeviceInterfaceDetail
(hDevInfo,
&devInfoData,
detailData,
RequiredSize,//Length,
&Required,
NULL);
if (!Result) {
DWORD dwError = GetLastError();
}

//创建设备对象
DeviceHandle=CreateFile
(detailData->DevicePath,
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
0,
NULL);

Attributes.Size = sizeof(Attributes);

//获取指定对象的属性
Result = HidD_GetAttributes
(DeviceHandle,
&Attributes);

MyDeviceDetected = FALSE;

//根据VIP,PID判断是否为所需设备
if (Attributes.VendorID == VendorID)
{
if (Attributes.ProductID == ProductID)
{
MyDeviceDetected = TRUE;
MyDevicePathName = detailData->DevicePath;
=

}

else
CloseHandle(DeviceHandle);
}

else
CloseHandle(DeviceHandle);

free(detailData);

}
else
LastDevice=TRUE;

MemberIndex = MemberIndex + 1;

}

while ((LastDevice == FALSE) && (MyDeviceDetected == FALSE));

SetupDiDestroyDeviceInfoList(hDevInfo);

return MyDeviceDetected;

}
...全文
651 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenghaiou 2013-06-08
  • 打赏
  • 举报
回复
设置一下对齐方式: project options -> advanced compiler -> data alignment 选择 byte
keri_syml 2013-06-04
  • 打赏
  • 举报
回复
C++ Builder会USB HID的人这么少啊,真是少之又少
keri_syml 2013-06-03
  • 打赏
  • 举报
回复
引用 1 楼 xjq2003 的回复:
SetupDiGetDeviceInterfaceDetail出错是参数设置不对吧?
这个参数的问题普遍反映比较多,不过我查了很多资料,我看我写的应该都没有问题的,参数都设置的对的
xjq2003 2013-06-03
  • 打赏
  • 举报
回复
SetupDiGetDeviceInterfaceDetail出错是参数设置不对吧?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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