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 :

Problème : erreur de segmentation.


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Problème : erreur de segmentation.
    Bonjour à tous.
    J'utilise une class externe dans mon programme (nommé "UsbHID") qui me permet d'accéder à un périphérique USB.

    Voici le header :
    Code C++ : 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
    #if defined(WIN32)
    
    #include <windows.h>
    #include <setupapi.h>
    extern "C" {
    #include <hidsdi.h>
    }
    
    #endif
    
    namespace CyberGarage {
    
    class UsbHID
    {
    private:
    
    #if defined(WIN32)
    	SP_DEVICE_INTERFACE_DETAIL_DATA *mDevIfDetailData;
    	HANDLE mDevHandle;
    	HIDD_ATTRIBUTES mDevAttr;
    	HIDP_CAPS mDevCaps;
    	HANDLE  mDevEvent;
    	OVERLAPPED mOverLapped;
    	unsigned char *mInputBuf;
    	unsigned char *mOutputBuf;
    #endif
    
    public:
    
    	UsbHID();
    	virtual ~UsbHID();
    
    	bool open(int venderID, int productID);
    	bool close();
    
    	bool isConnected() 
    	{
    		return (mDevHandle ? true : false);
    	}
    
    	int read();
    	int write(unsigned char *data, int dataLen);
    
        //...Code inutile...
    
    #if defined(WIN32)
    	void GetLastError();
    #endif
    };
    
    }
    
    #endif

    J'ai remarqué que la fonction qui me pose problème est "open()" : elle me provoque une erreur de segmentation.
    Voici le rapport du debugger
    Code TXT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #0 0000D514	??() (??:??)
    #1 00401508	??() (??:??)
    #2 0022FED0	??() (??:??)
    #3 0022FC1C	??() (??:??)
    #4 41416161	??() (??:??)
    #5 0022FE6C	??() (??:??)
    #6 7C91EE18	strchr() (C:\WINDOWS\system32\ntdll.dll:??)
    #7 7C9206F0	ntdll!RtlAppendStringToString() (C:\WINDOWS\system32\ntdll.dll:??)
    #8 FFFFFFFF	??() (??:??)
    #9 7C9206EB	ntdll!RtlAppendStringToString() (C:\WINDOWS\system32\ntdll.dll:??)
    #10 77BFC3C9	msvcrt!free() (C:\WINDOWS\system32\msvcrt.dll:??)
    #11 003D0000	??() (??:??)
    #12 40000060	??() (??:??)
    #13 77BFC3CE	msvcrt!free() (C:\WINDOWS\system32\msvcrt.dll:??)
    #14 00000000	??() (??:??)

    Pourtant d'après le développeur, ça version est stable.
    Donc je ne voie pas pourquoi cette erreur survient ??

















    Code de la fonction open() qui est plutôt costaud
    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
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
    	HidD_GetHidGuid(&guid);
     
    	HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
    	if (devInfoSet == INVALID_HANDLE_VALUE)
    		return false;
     
    	SP_DEVICE_INTERFACE_DATA devIf;
    	devIf.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    	for (int i=0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &guid, i, &devIf); i++) {
    		DWORD devIfDetailSize = 0;
    		SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, NULL, 0, &devIfDetailSize, 0);
    		if (devIfDetailSize <=0)
    			continue;
    		SP_DEVICE_INTERFACE_DETAIL_DATA *devIfDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(devIfDetailSize);
    		devIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    		if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, devIfDetail, devIfDetailSize, &devIfDetailSize, 0) != 0) {
    			HANDLE devHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    			if(devHandle == INVALID_HANDLE_VALUE) {
    				free(devIfDetail);
    				continue;
    			}
    			HIDD_ATTRIBUTES devAttr;
    			if (!HidD_GetAttributes(devHandle, &devAttr)) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			PHIDP_PREPARSED_DATA devPreData;
    			if (!HidD_GetPreparsedData(devHandle, &devPreData )) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			HIDP_CAPS devCaps;
    			if (HidP_GetCaps(devPreData, &devCaps ) != HIDP_STATUS_SUCCESS ) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			CloseHandle(devHandle);
    			if (devAttr.VendorID == venderID && devAttr.ProductID == productID) {
    				mDevHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    				SetupDiDestroyDeviceInfoList(devInfoSet);
    				memcpy(&mDevAttr, &devAttr, sizeof(HIDD_ATTRIBUTES));
    				memcpy(&mDevCaps, &devCaps, sizeof(HIDP_CAPS));
    				mInputBuf = (unsigned char *)malloc(mDevCaps.InputReportByteLength);
    				mOutputBuf = (unsigned char *)malloc(mDevCaps.OutputReportByteLength);
    				return true;
    			}
    		}
    		free(devIfDetail);
    	}
     
    	SetupDiDestroyDeviceInfoList(devInfoSet);
     
    	return false;
    }

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    quel debugger utilises-tu?

    Dans tous les cas, si tu désactive les optimisations lors de la compilation, et que tu actives les options de debuggage ( profile code, debugging symbols), tout ça dans les options de compilation, tu auras des informations beaucoup plus précises sur le plantage.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bah j'utilise le tout simple debugger de code::blocks.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Fait nous un vrai rapport de bug : ou se produit l'erreur exactement (ou va pas faire le boulot a ta place) le stack trace avec les noms des fonctions, c'est mieux, avec un -Wall dans les paramètres de compilation, ca donne des infos ?

    Bref, aide toi toi même en nous aidant.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Je viens d'avancer dans mon erreur : après une série de plusieurs petit tests,
    J'ai trouvé la fonction à la base de l'erreur (dans la fonction open() )
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
    	HidD_GetHidGuid(&guid);
     
         // Code sans problème
    }

    et j'ai trouvé son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __stdcall
    HidD_GetHidGuid (
       OUT   LPGUID   HidGuid
       );

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    QUE TU DIS LA COMPILATION AVEC WALL ???

    QUE DONNE LE STACK TRACE AVEC LES NOMS A LA PLACE DES ???? (Options de compilation).

    D'ou sort cette fonction HidD_GetHidGuid ? Est-elle fiable ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci de prendre du temps à mon problème deadalnix.

    Alors j'ai bien mis le paramètre -Wall dans "debugger initialization commands", mais ça ne change rien au rapport. Je pense que ça vient du fait que la fonction se trouve dans un .a

    Oui elle devrait être fiable, car elle proviens de la DDK (- Windows Driver Development Kit)

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Sinon tu peux essayer de faire tourner ton programme avec valgrind, ça aide bien.
    Mais ça marche que sous linux, donc ça risque d'être difficile à compiler, même en utilisant libwine.
    Boost ftw

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    C'est étrange. As-tu la définition de GUID ?

    Si ceci n'est pas un classe a toi, peut-etre contient-elle un pointeur qui n'est pas initialisé. Peut être devrais-tu essayer de lancer le constructeur par defaut.

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    comme je te l'ai dit dans mon premier post, enlève les optimisations (décoche -O2), rajoute les options de debug (-g -pg), et décoche la case -s (strip all symbols).

    Avec ça tu auras un bon rapport de débug

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    loufoque : désolé mais je n'ai pas linux :/

    deadalnix : j'ai pas trouvé la definition de GUID dans les headers, mais j'ai trouvé ça sur msdn : http://msdn.microsoft.com/en-us/library/ms790927.aspx
    (et si tu clique sur GUID dans le texte, il te donne ça définition; mais moi, ça ne m'éclaire pas trop)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    coyote : je ne trouves pas tous les paramètres que tu m'as indiqué.
    J'ai juste réussi à ajouter les autres, mais ça ne change rien.


  13. #13
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Non c'est dans les options de compilations (là où y'a le Wall et tout) pas dans les debugger settings

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Ça y est, j'ai bien trouvé les options dont tu parlais.
    Mais cela n'a rien changer au rapport final :/

  15. #15
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Bizarre...

    Tu-as bien "rebuild" (ctrl+F9)?

    Je ne sais pas si tu sais, mais pour changer les options de compilation, il ne faut pas aller dans settings->compiler & debugger, mais clic croit sur le projet->build options, et là tu coches/décoches les cases citées...

    Si au pire t'arrives toujours pas à débugger, tu peux uploader ton projet pour qu'on teste..

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Cette fois jai bien changé aux bons endroits (-g -pg...), mais je ne vois pas de grands changements :/

    J'ai mis ici un zip de mon projet code::blocks.

  17. #17
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    je t'avais dit de décocher les cases d'optimisation (-O2) et strip all symbols (-s)

    Je ne peux pas tester, il n'y a pas le fichier Wiimote.h.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Je crois que wiimote.h est inutile ici, mais je te l'ai quand même uploadé.

    Avec les paramètres changés, j'ai un nouveau log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #0 0000E69C	??() (??:??)
    #1 0040152F	CyberGarage::UsbHID::open(this=0x3d25a0, venderID=1406, productID=774) (UsbHID.cpp:52)
    #2 00401EA3	main(argc=1, argv=0x3d2470) (main.cpp:10)
    Et c'est bien ce que je soupçonnais, à la ligne 52 : c'est la fonction HidD_GetHidGuid(&guid); qui provoque l'erreur.
    (dans un post précédent j'ai mis des liens la concernant : je ne voie pas de problème particulier oO)

  19. #19
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    j'ai enfin réussi à compiler

    Le programme me dit "Wiimote introuvable"

    Ce qui veut dire que la fonction open a retourné false.

    Or:

    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
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
    	HidD_GetHidGuid(&guid);
     
    	HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
            //Ici se trouve le premier "return false"
    	if (devInfoSet == INVALID_HANDLE_VALUE)
    		return false;
     
    	SP_DEVICE_INTERFACE_DATA devIf;
    	devIf.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    	for (int i=0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &guid, i, &devIf); i++) {
    		DWORD devIfDetailSize = 0;
    		SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, NULL, 0, &devIfDetailSize, 0);
    		if (devIfDetailSize <=0)
    			continue;
    		SP_DEVICE_INTERFACE_DETAIL_DATA *devIfDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(devIfDetailSize);
    		devIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    		if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, devIfDetail, devIfDetailSize, &devIfDetailSize, 0) != 0) {
    			HANDLE devHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    			if(devHandle == INVALID_HANDLE_VALUE) {
    				free(devIfDetail);
    				continue;
    			}
    			HIDD_ATTRIBUTES devAttr;
    			if (!HidD_GetAttributes(devHandle, &devAttr)) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			PHIDP_PREPARSED_DATA devPreData;
    			if (!HidD_GetPreparsedData(devHandle, &devPreData )) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			HIDP_CAPS devCaps;
    			if (HidP_GetCaps(devPreData, &devCaps ) != HIDP_STATUS_SUCCESS ) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			CloseHandle(devHandle);
    			if (devAttr.VendorID == venderID && devAttr.ProductID == productID) {
    				mDevHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    				SetupDiDestroyDeviceInfoList(devInfoSet);
    				memcpy(&mDevAttr, &devAttr, sizeof(HIDD_ATTRIBUTES));
    				memcpy(&mDevCaps, &devCaps, sizeof(HIDP_CAPS));
    				mInputBuf = (unsigned char *)malloc(mDevCaps.InputReportByteLength);
    				mOutputBuf = (unsigned char *)malloc(mDevCaps.OutputReportByteLength);
    				return true;
    			}
    		}
    		free(devIfDetail);
    	}
     
    	SetupDiDestroyDeviceInfoList(devInfoSet);
     
    	return false;
    }
    Comme tu le vois, si la fonction a retourné false sans encombres pour moi, ça veut dire qu'elle bugge plus tard. (la fonction HidD_GetHidGuid() n'est donc pas en cause )

    Refais des tests à coups de "fprintf" vers stdlog (écriture immédiate, pas dans le tampon), pour voir où la fonction bugge vraiment.

    Genre:

    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
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
     
    	GUID guid;
            fprintf(stdlog, "Appel à HidD_GetHidGuid\n");
    	HidD_GetHidGuid(&guid);
            fprintf(stdlog, "Appel à SetupDiGetClassDevs\n");
    	HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
    	if (devInfoSet == INVALID_HANDLE_VALUE)
    		return false;
     
    	SP_DEVICE_INTERFACE_DATA devIf;
    	devIf.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
            fprintf(stdlog, "Début de la boucle for\n");
    	for (int i=0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &guid, i, &devIf); i++) {
                    fprintf(stdlog, "Itération\n");
    		DWORD devIfDetailSize = 0;
    		SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, NULL, 0, &devIfDetailSize, 0);
    		if (devIfDetailSize <=0)
    			continue;
    		SP_DEVICE_INTERFACE_DETAIL_DATA *devIfDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(devIfDetailSize);
    		devIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    		if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, devIfDetail, devIfDetailSize, &devIfDetailSize, 0) != 0) {
    			HANDLE devHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    			if(devHandle == INVALID_HANDLE_VALUE) {
    				free(devIfDetail);
    				continue;
    			}
    			HIDD_ATTRIBUTES devAttr;
    			if (!HidD_GetAttributes(devHandle, &devAttr)) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			PHIDP_PREPARSED_DATA devPreData;
    			if (!HidD_GetPreparsedData(devHandle, &devPreData )) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			HIDP_CAPS devCaps;
    			if (HidP_GetCaps(devPreData, &devCaps ) != HIDP_STATUS_SUCCESS ) {
    				free(devIfDetail);
    				CloseHandle(devHandle);
    				continue;
    			}
    			CloseHandle(devHandle);
    			if (devAttr.VendorID == venderID && devAttr.ProductID == productID) {
    				mDevHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    				SetupDiDestroyDeviceInfoList(devInfoSet);
    				memcpy(&mDevAttr, &devAttr, sizeof(HIDD_ATTRIBUTES));
    				memcpy(&mDevCaps, &devCaps, sizeof(HIDP_CAPS));
    				mInputBuf = (unsigned char *)malloc(mDevCaps.InputReportByteLength);
    				mOutputBuf = (unsigned char *)malloc(mDevCaps.OutputReportByteLength);
    				return true;
    			}
    		}
    		free(devIfDetail);
    	}
     
    	SetupDiDestroyDeviceInfoList(devInfoSet);
     
    	return false;
    }
    Et en continuant à logger presque chaque ligne, tu verras à quelle ligne exactement ça plante.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Il te met wiimote introuvable ?
    Moi je n'ai même pas ce "printf", l'erreur de segmentation se fait avant.

    Et puis j'ai testé avec des printf a chaque ligne dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool UsbHID::open(int venderID, int productID)
    {
    	close();
        printf("creation de lobjet guid\n");
    	GUID guid;
    	printf("get guid\n");
    	HidD_GetHidGuid(&guid);
        printf("creation de lobjet devinfo\n");
    	HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
    	if (devInfoSet == INVALID_HANDLE_VALUE)
    		return false;
    Et il ne s'affiche que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    creation de lobjet guid
    get guid
    Donc l'erreur se trouve dans gethidguid, non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. erreur de segmentation , probléme de compilation
    Par henda333 dans le forum C++
    Réponses: 1
    Dernier message: 18/06/2014, 21h19
  2. Problème d'erreur de segmentation
    Par vinassefranche dans le forum C
    Réponses: 6
    Dernier message: 02/06/2014, 18h59
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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