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;
}