首页 > 代码库 > C++获取设备 PID,VID 信息

C++获取设备 PID,VID 信息

可直接编译(设置成:使用多字节字符集)

转来的,代码:

/*http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.html*/#include <stdio.h>#include <windows.h>#include <setupapi.h>#include <devguid.h>#include <winioctl.h>#include <regstr.h>#include <tchar.h>#include <string>using namespace std;#pragma comment(lib,"setupapi.lib")/*获取设备数	路径: 如G:	设备数*/BOOL GetDeviceNumber(LPCTSTR pszDevPath, DWORD& dwDevNum) {	BOOL bRC = FALSE;	HANDLE hDrive = CreateFile(		pszDevPath,		0,		FILE_SHARE_READ | FILE_SHARE_WRITE,		NULL,		OPEN_EXISTING, 		NULL, 		NULL		);	if (INVALID_HANDLE_VALUE != hDrive) {		STORAGE_DEVICE_NUMBER sdn;		DWORD dwBytesReturned = 0;		bRC = DeviceIoControl(			hDrive,			IOCTL_STORAGE_GET_DEVICE_NUMBER,			NULL, 			0, 			&sdn, 			sizeof(sdn),			&dwBytesReturned, 			NULL			);		if (bRC) dwDevNum = sdn.DeviceNumber;		CloseHandle(hDrive);	}else printf("Error:[%d] (%s)\n",GetLastError(),pszDevPath);	return bRC;    }int GetDeviceDescription(LPCTSTR pszDrive, TCHAR* pszDesc, const size_t szDescSize){	TCHAR acDevName[MAX_PATH];	//  QueryDosDevice(pszDrive,acDevName,MAX_PATH);	//  printf("Test: %s\n",acDevName);	_stprintf(acDevName,"\\\\.\\%s", pszDrive);	DWORD dwNumOfInterest = -1;;	GetDeviceNumber(acDevName,dwNumOfInterest);	//printf("DeviceNumber:[%d]\n",dwNumOfInterest);	GUID* guid = (GUID*)&GUID_DEVINTERFACE_DISK;	// Get device interface info set handle	// for all devices attached to system	HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL,		DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);	if (hDevInfo == INVALID_HANDLE_VALUE)  {		return 0;	}	// Retrieve a context structure for a device interface	// of a device information set.	DWORD dwIndex = 0;	BOOL bRet = FALSE;	BYTE Buf[1024];	PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =		(PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;	SP_DEVICE_INTERFACE_DATA         spdid;	SP_DEVINFO_DATA                  spdd;	DWORD                            dwSize;	spdid.cbSize = sizeof(spdid);	while ( true )  {		bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL,			guid, dwIndex, &spdid);		if (!bRet) {			break;		}		dwSize = 0;		SetupDiGetDeviceInterfaceDetail(hDevInfo,			&spdid, NULL, 0, &dwSize, NULL);		if ( dwSize!=0 && dwSize<=sizeof(Buf) ) {			pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!			ZeroMemory((PVOID)&spdd, sizeof(spdd));			spdd.cbSize = sizeof(spdd);			long res =				SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd,				dwSize, &dwSize,				&spdd);			printf("Result:[%s]\n",pspdidd->DevicePath); // <--------- here!			DWORD dwType;			LPTSTR buffer = NULL;			DWORD buffersize = 0;			while (!SetupDiGetDeviceRegistryProperty(				hDevInfo,				&spdd,				SPDRP_FRIENDLYNAME,				&dwType,				(PBYTE)buffer,				buffersize,				&buffersize))			{				if (GetLastError() == 					ERROR_INSUFFICIENT_BUFFER)				{					// Change the buffer size.					if (buffer) LocalFree(buffer);					// Double the size to avoid problems on 					// W2k MBCS systems per KB 888609. 					buffer =(LPTSTR) LocalAlloc(LPTR,buffersize * 2);				}				else				{					// Insert error handling here.					break;				}			}			DWORD dwNum = 0;;			GetDeviceNumber(pspdidd->DevicePath,dwNum);			//printf("DeviceNumber:[%d]\n",dwNum);			//if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),buffer);			if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),pspdidd->DevicePath);			//printf("Result:[%s]\n",buffer);     			if (buffer) LocalFree(buffer); 		}		dwIndex++;	}	SetupDiDestroyDeviceInfoList(hDevInfo);	return 0;}void main (int argc, char** argv) {	TCHAR acDesc[1024] = "<unknown>";	TCHAR* pszDrive;	if (2 != argc) {		printf("Usage: usbdev.exe <drive letter> (ex.: ‘usbdev f:‘)\n");	}	pszDrive = *(argv + 1);	GetDeviceDescription(pszDrive, acDesc, 1024);	_tprintf("\nDescription for %s\n\n\t%s\n", pszDrive, acDesc);	system("pause");}

C++获取设备 PID,VID 信息