首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

开发USB HID的源码,调用SetupDiGetDeviceInterfaceDetail疏失

2013-09-05 
开发USB HID的源码,调用SetupDiGetDeviceInterfaceDetail出错?调用第一次SetupDiGetDeviceInterfaceDetail

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



private:// User declarations

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

boolean TUSBHID::HidUsb_Conn(int VendorID,int ProductID)
{
HIDD_ATTRIBUTESAttributes;
   //DWORDDeviceUsage;
SP_DEVICE_INTERFACE_DATAdevInfoData;
boolLastDevice = FALSE;
intMemberIndex = 0;
LONGResult;


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;

}


[解决办法]
SetupDiGetDeviceInterfaceDetail出错是参数设置不对吧?
[解决办法]
设置一下对齐方式:
project options -> advanced compiler -> data alignment 选择 byte

热点排行