Помните, как я ругался на функцию GetRawInputDeviceList?

Оказалось, что это была ошибка в документации. Её поправили и посмотрите, что получилось.

Было:

puiNumDevices

[in, out] Pointer to a variable. If pRawInputDeviceList is NULL, it specifies the number of devices attached to the system. Otherwise, it contains the size, in bytes, of the preallocated buffer pointed to by pRawInputDeviceList. However, if *puiNumDevices is smaller than needed to contain RAWINPUTDEVICELIST structures, the required buffer size is returned here.

Стало:

puiNumDevices

[in, out] Pointer to a variable. If pRawInputDeviceList is NULL, the function populates this variable with the number of devices attached to the system; otherwise, this variable specifies the number of RAWINPUTDEVICELIST structures that can be contained in the buffer to which pRawInputDeviceList points. If this value is less than the number of devices attached to the system, the function returns the actual number of devices in this variable and fails with ERROR_INSUFFICIENT_BUFFER.

Самое смешное, что код, вызывающий эту функцию и написанный в соответствии с ошибочной версией документации, все равно работает. Дело в том при первом вызове функции, когда приложение запрашивает размер буфера, оно получает его в виде числа структур RAWINPUTDEVICELIST. А во время второго вызова, хотя и размер указан в байтах (как того требовала документация), функция помещает в буфер ровно столько структур RAWINPUTDEVICELIST, сколько было обнаружено при первом вызове. Естественно, в случае, если количество устройств в системе не изменилось между двумя вызовами, что очень маловероятно.

P.S. А Word среагировал на «ругался на функцию» следующим замечанием: «Ошибка в управлении. Ругаться можно с кем-то. В речи малограмотных людей часто употребляется этот оборот вместо «ругать кого либо». Ох, малограмотные мы! Эх…

comments powered by Disqus