【发布时间】:2016-07-11 08:45:57
【问题描述】:
我遇到了 3 个函数(HidD_GetManufacturerString、HidD_GetProductString、HidD_GetSerialNumberString)的问题。问题是它们返回TRUE(表示成功),但不修改缓冲区(甚至不添加终止符)。
功能的 MSDN 页面:
HidD_GetManufacturerString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff538959%28v=vs.85%29.aspx
HidD_GetProductString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff539681%28v=vs.85%29.aspx
HidD_GetSerialNumberString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff539683%28v=vs.85%29.aspx
下面是实际调用方法的代码:
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);
DevIntfDetailData 使用 SetupDiGetDeviceInterfaceDetail 填充
MAX_SERIAL_LEN 定义为
sizeof(wchar_t)*127
【问题讨论】:
-
呃,你用ZeroMemory怎么知道它不只是一个空字符串?删除这些呼叫,然后重试。
-
就像我在第一段中所说的那样,它甚至没有添加终止符,它会在零字符串上添加。缓冲区真的没有被触及
-
也许你没抓住重点。当缓冲区已经包含零时,如何检测它写入零字符?
-
因为我专门将内存归零,因为它没有添加终结符