IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Debutant : Analyse de chaine de caracteres


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Par défaut Debutant : Analyse de chaine de caracteres
    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;
     
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Attention, tu as posté dans un forum C++ donc je te répond en C++

    Code La fonction d'extraction : 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
     
    bool Find(const char *StrBegin, const char *StrEnd, const std::string & Input, std::string & Output)
    {
    	// search from the beginning
    	int begin = Input.find(StrBegin, 0);
    	if(begin == -1)
    	{
    		// not found
    		return false;
    	}
     
    	// skip the string to found
    	begin += strlen(StrBegin);
     
    	int end = Input.find(StrEnd, begin);
    	if(end == -1)
    	{
    		// not found
    		return false;
    	}
     
    	// extract the substring
    	Output = Input.substr(begin, end - begin);
    	return true;
    }

    Code l'appel : 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
     
    int main(int /*argc*/, wchar_t * /*argv[]*/)
    {
    	std::string input = "HID\\VID_03F0&PID_0B0C&REV_0100&MI_00";
    	std::string output;
    	if(Find("VID_", "&", input, output) == false)
    	{
    		printf("not found\n");
    		return 0;
    	}
     
    	printf("VID_ found=[%s]\n", output.c_str());
     
    	if(Find("PID_", "&", input, output) == false)
    	{
    		printf("not found\n");
    		return 0;
    	}
     
    	printf("PID_ found=[%s]\n", output.c_str());
    	return 0;
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. [Debutant]Recherche de chaines de caracteres
    Par Sourrisseau dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2007, 08h30
  2. analyser une chaine de caractere
    Par phpaide dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2006, 10h46
  3. [debutant][traitement de chaine de caractere]
    Par hash92 dans le forum Langage
    Réponses: 3
    Dernier message: 14/12/2005, 15h53
  4. debutant asp manipulation chaine de caractere
    Par MaxiMax dans le forum ASP
    Réponses: 3
    Dernier message: 12/08/2005, 15h59
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo