C++ HidD_GetManufacturerString和类似函数返回成功,但不修改缓冲区

C++ HidD_GetManufacturerString和类似函数返回成功,但不修改缓冲区,c++,winapi,usb,hid,C++,Winapi,Usb,Hid,我在3个函数中遇到问题(HidD\u GetManufacturerString,HidD\u GetProductString,HidD\u GetSerialNumberString)。问题是它们返回TRUE(表示成功),但不修改缓冲区(甚至不添加终止符) 功能的MSDN页面: HidD\u GetManufacturerString: HidD\u GetProductString: HidD\u GetSerialNumberString: 以下是实际调用这些方法的代码: wchar_t

我在3个函数中遇到问题(
HidD\u GetManufacturerString
HidD\u GetProductString
HidD\u GetSerialNumberString
)。问题是它们返回
TRUE
(表示成功),但不修改缓冲区(甚至不添加终止符)

功能的MSDN页面:

HidD\u GetManufacturerString

HidD\u GetProductString

HidD\u GetSerialNumberString

以下是实际调用这些方法的代码:

wchar_t manufacturer[MAX_SERIAL_LEN];
wchar_t product[MAX_SERIAL_LEN];
wchar_t serial[MAX_SERIAL_LEN];

ZeroMemory(manufacturer, MAX_SERIAL_LEN);
ZeroMemory(product, MAX_SERIAL_LEN);
ZeroMemory(serial, MAX_SERIAL_LEN);

HidD_GetManufacturerString(hFile, manufacturer, MAX_SERIAL_LEN);
HidD_GetProductString(hFile, product, MAX_SERIAL_LEN);
HidD_GetSerialNumberString(hFile, serial, MAX_SERIAL_LEN);

printf("Information for device %s\nManufacturer: %S\nProduct: %S\nSerial: %S\n\n", 
    DevIntfDetailData->DevicePath, 
    manufacturer, product, serial
);
hFile
是这样打开的:

HANDLE hFile = CreateFile(DevIntfDetailData->DevicePath, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
DeviceDetailData
使用
SetupDiGetDeviceInterfaceDetail

MAX\u SERIAL\u LEN
定义为

sizeof(wchar_t)*127
可能是一个驱动程序错误

我有一个类似的问题:函数返回
TRUE
,但缓冲区要么根本没有被触及,要么被随机垃圾填满

这里有一个陷阱:这种情况只发生在我的耳机上,而且只有当我通过Skype/Teams/等积极使用它的麦克风时才会发生。一旦我离开电话,这些功能就会再次返回普通名称

这让我相信你看到的是一个有毛病的司机。我的是Windows 10 1907上的Windows标准耳机驱动程序。

可能是驱动程序错误

我有一个类似的问题:函数返回
TRUE
,但缓冲区要么根本没有被触及,要么被随机垃圾填满

这里有一个陷阱:这种情况只发生在我的耳机上,而且只有当我通过Skype/Teams/等积极使用它的麦克风时才会发生。一旦我离开电话,这些功能就会再次返回普通名称


这让我相信你看到的是一个有毛病的司机。我的是Windows 10 1907上的Windows标准耳机驱动程序。

Erm,当你使用ZeroMemory时,你怎么知道它不仅仅是一个空字符串?删除这些调用,然后再试一次。就像我在第一段中说的,它甚至没有添加一个终止符,它会在零字符串上添加终止符。缓冲区真的没有被触及可能你没抓住重点。当缓冲区已经包含零时,您如何检测它写入零字符?因为我专门将内存归零,因为它没有添加TerminatorRem,所以当您使用ZeroMemory时,您如何知道它不仅仅是一个空字符串?删除这些调用,然后再试一次。就像我在第一段中说的,它甚至没有添加一个终止符,它会在零字符串上添加终止符。缓冲区真的没有被触及可能你没抓住重点。当缓冲区已经包含零时,如何检测它写入零字符?因为我专门将内存归零,因为它没有添加终止符