我想在我的应用程序里获得一个USB设备的属性(下面是原码),在执行SetupDiEnumDeviceInterfaces()时出错:No more data is available。
请看一看一段代码:
const GUID hidGuid= {0x4D36E96D, 0xE325, 0x11CE, {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18}};
HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
NULL, // no enumerator
NULL, // no parent
(DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));
if(!hDevInfo)
{
m_st.SetWindowText("Couldn't get handle for HID devices");
return;
}
SP_INTERFACE_DEVICE_DATA devInfoData;
devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
int deviceNo = 0;
SetLastError(NO_ERROR);
while(GetLastError() != ERROR_NO_MORE_ITEMS)
{
if(SetupDiEnumInterfaceDevice (hDevInfo,
0,
&hidGuid,
deviceNo,
&devInfoData))
{
ULONG requiredLength = 0;
SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
NULL,
0,
&requiredLength,
NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(! SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
devDetail,
requiredLength,
NULL,
NULL))
{
AfxMessageBox("Couldn't get HID details");
free(devDetail);
return;
}
// open a file to this device
HANDLE hidHandle = CreateFile(devDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
free(devDetail);
if(INVALID_HANDLE_VALUE == hidHandle)
{
AfxMessageBox("Couldn't get HID handle");
return;
}
问题点数:50、回复次数:5
Top
1 楼taianmonkey()回复于 2004-08-02 21:27:12 得分 50#include "Setupapi.h"
#include "afxwin.h"
#pragma comment(lib,"Setupapi.lib")
GUID hidGuid= {0x4D36E96D, 0xE325, 0x11CE, {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18}};
........
HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
NULL, // no enumerator
NULL, // no parent
(DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));
if(!hDevInfo)
{
AfxMessageBox(_T("Couldn't get handle for HID devices"));
return;
}
SP_INTERFACE_DEVICE_DATA devInfoData;
devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
int deviceNo = 0;
SetLastError(NO_ERROR);
while(GetLastError() != ERROR_NO_MORE_ITEMS)
{
if(SetupDiEnumInterfaceDevice (hDevInfo,
0,
&hidGuid,
deviceNo,
&devInfoData))
{
ULONG requiredLength = 0;
SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
NULL,
0,
&requiredLength,
NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(! SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
devDetail,
requiredLength,
NULL,
NULL))
{
AfxMessageBox("Couldn't get HID details");
free(devDetail);
return;
}
// open a file to this device
HANDLE hidHandle = CreateFile(devDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
free(devDetail);
if(INVALID_HANDLE_VALUE == hidHandle)
{
AfxMessageBox("Couldn't get HID handle");
return;
}
}
}
Top
2 楼zhangnanonnet(鱼欢)回复于 2004-08-02 21:42:31 得分 0 #include <objbase.h>
#include <setupapi.h>
#include <initguid.h>
#define USB_GUID_STR "{B5157D69-75F8-11d3-8CE0-00207815E456}" //define the GUID for your device class
DEFINE_GUID(USB_GUID, 0xb5157d69, 0x75f8, 0x11d3, 0x8c, 0xe0, 0x0, 0x20, 0x78, 0x15, 0xe4, 0x56);
#define MAX_INSTANCE 10
char name[MAX_INSTANCE][MAX_PATH];//the device path is returned, which can be used to open the device as the file name.
int Scan(void) //return the number of the device attached. Zero, if the device is not attached.
{
// Get handle to the devices manager
HDEVINFO hInfo = SetupDiGetClassDevs((LPGUID)&USB_GUID, NULL, NULL,
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if (hInfo == INVALID_HANDLE_VALUE) // check for error
return(0);
for (DWORD i=0; ; ++i) // loop till all devices are found
{
SP_INTERFACE_DEVICE_DATA Interface_Info; // declare structure
Interface_Info.cbSize = sizeof(Interface_Info); // Enumerate device
if (!SetupDiEnumInterfaceDevice(hInfo, NULL, (LPGUID) &USB_GUID,i, &Interface_Info))
{
SetupDiDestroyDeviceInfoList(hInfo);
return(i);
}
DWORD needed; // get the required lenght
SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info, NULL, 0, &needed, NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
if (!detail)
{
SetupDiDestroyDeviceInfoList(hInfo);
return(i);
}
// fill the device details
detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (!SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info, detail, needed,NULL, NULL))
{
free((PVOID) detail);
SetupDiDestroyDeviceInfoList(hInfo);
return(i);
}
strncpy(name[i], detail->DevicePath, MAX_PATH); // copy the device name
free((PVOID) detail); // free the mem
}
}
Top
3 楼codewarrior(会思考的草)回复于 2004-08-03 07:50:20 得分 0 DEFINE_GUID (GUID_CLASS_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
BOOL CDeviceList::Initialize()
{
HDEVINFO hDevInfoSet = SetupDiGetClassDevs(&m_Guid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if(hDevInfoSet == INVALID_HANDLE_VALUE)
{
return FALSE;
}
SP_DEVICE_INTERFACE_DATA DevIfData = {0};
DevIfData.cbSize = sizeof(DevIfData);
for(DWORD dwDevIndex=0; SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &m_Guid, dwDevIndex, &DevIfData); ++dwDevIndex)
{
DWORD dwNeededSz = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevIfData, NULL, 0, &dwNeededSz, NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA pDevIfDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(dwNeededSz);
pDevIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
SP_DEVINFO_DATA DevInfo = {0};
DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
if(!SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevIfData, pDevIfDetail, dwNeededSz, NULL, &DevInfo))
{
free((PVOID) pDevIfDetail);
continue;
}
TCHAR fname[256] = {0};
if(!SetupDiGetDeviceRegistryProperty(hDevInfoSet, &DevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE) fname, sizeof(fname), NULL) &&
!SetupDiGetDeviceRegistryProperty(hDevInfoSet, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE) fname, sizeof(fname), NULL))
{
_tcsncpy(fname, pDevIfDetail->DevicePath, 256);
}
m_DevList.push_back(CDeviceListEntry(pDevIfDetail->DevicePath, fname));
free((PVOID)pDevIfDetail);
}
SetupDiDestroyDeviceInfoList(hDevInfoSet);
return TRUE;
}