Bonjour !!

Je ne suis pas informaticien de formation (je suis plutot opticien) et j'ai quelques bases en C et je découvre le C++

Je travaille sur des cartes microcontroleurs, avec laquelle le fabricant fournit des codes d'exemple afin de pouvoir programmer sa carte.

Dans le but de m'approprier le code et de comprendre les fonctions appelées, j'ai décidé de le réécrire ligne par ligne.

Le but de ce programme est de récupérer le Vid et le Pid d'un périphérique HID.

J'ai réussi à récupérer la chaine de caractères correspondant aux identifiants du périphérique, mais je ne sais pas comment en extraire uniquement le Vid et le Pid.

Voici le code que j'ai tapé sous visual C++ dans une application console :
J'ai un peu mixé les commentaires francais (les miens) et anglais (ceux du fabricant)
Avec ce code j'arrive a afficher dans ma console, la chaine de caractères voulue, à savoir

HID\VID_03F0&PID_0B0C&REV_0100&MI_00


Et je cherche maintenant a récupérer les Vid et Pid (en gras) de cette chaine de caractères !

Merci de votre aide !
Cordialement
Jérôme


le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <setupapi.h>
 
#define MY_DEVICE_ID  "Vid_04d8&Pid_0040"
 
int main()
{
// GUID des devices qui nous intéressent, qu'on va passer en parametre de la fonction SetupdiGetClassDevs()
GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}; 
 
HDEVINFO DeviceInfoTable = INVALID_HANDLE_VALUE;
PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA;
PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA;
SP_DEVINFO_DATA DevInfoData;
 
	DWORD InterfaceIndex = 0;
	DWORD StatusLastError = 0;
	DWORD dwRegType;
	DWORD dwRegSize;
	DWORD StructureSize = 0;
	PBYTE PropertyValueBuffer;
	bool MatchFound = false;
	DWORD ErrorStatus;
 
 
	HANDLE WriteHandle = INVALID_HANDLE_VALUE;	
	HANDLE ReadHandle = INVALID_HANDLE_VALUE;
 
//First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the specified classGUID. 
DeviceInfoTable = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
 
 
InterfaceDataStructure->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
SetupDiEnumDeviceInterfaces(DeviceInfoTable, NULL, &InterfaceClassGuid, InterfaceIndex, InterfaceDataStructure);
ErrorStatus = GetLastError();
if(ERROR_NO_MORE_ITEMS == GetLastError())	//Did we reach the end of the list of matching devices in the DeviceInfoTable?
{	//Cound not find the device.  Must not have been attached.
		SetupDiDestroyDeviceInfoList(DeviceInfoTable);	//Clean up the old structure we no longer need.
	//return ;	
}
 
//Now retrieve the hardware ID from the registry.  The hardware ID contains the VID and PID, which we will then 
//check to see if it is the correct device or not.
 
//Initialize an appropriate SP_DEVINFO_DATA structure.  We need this structure for SetupDiGetDeviceRegistryProperty().
		DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
		SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, &DevInfoData);
 
	//First query for the size of the hardware ID, so we can know how big a buffer to allocate for the data.
	SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID, &dwRegType, NULL, 0, &dwRegSize);
 
 
	//Allocate a buffer for the hardware ID.
	PropertyValueBuffer = (BYTE *) malloc (dwRegSize);
	if(PropertyValueBuffer == NULL)	//if null, error, couldn't allocate enough memory
	{	//Can't really recover from this situation, just exit instead.
		SetupDiDestroyDeviceInfoList(DeviceInfoTable);	//Clean up the old structure we no longer need.
			//	return;		
	}
 
 
	//Retrieve the hardware IDs for the current device we are looking at.  PropertyValueBuffer gets filled with a 
	//REG_MULTI_SZ (array of null terminated strings).  To find a device, we only care about the very first string in the
	//buffer, which will be the "device ID".  The device ID is a string which contains the VID and PID, in the example 
	//format "Vid_04d8&Pid_0040".
	SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID, &dwRegType, PropertyValueBuffer, dwRegSize, NULL);
 
 
	// a ce stade dans PropertyValueBuffer, on a un REG_MULTI_SZ qui est un tableau de "null terminated strings".o find a device, we only care about the very first string in the
	//buffer, which will be the "device ID".  The device ID is a string which contains the VID and PID, in the example 
	//format "Vid_04d8&Pid_0040"
 
_tprintf(_TEXT("\t\t%s\n"), PropertyValueBuffer);
 
 
 
 
	system("pause");
	return 0;
 
}