Vi, почему ты всегда пытаешься ко мне придраться?
По крайней мере VB передаст правильный указатель на число и оно будет изменено на новое значение.
То, что в данное случае передаётся, это вообще не то, на что я обращаю внимание своим постом. Я же говорю о кочующей заразительной частице глупости, которая заставляет людей использовать константу vbNull как полный аналог сишной константы NULL. Людей, которые даже не догадываются посмотреть реальное (а не кажущееся им) значение vbNull.
функции безразличное.
Как бы не так?
Когда функция/структура имеет зарезервированные параметры/поля, в документации при описании этих полей пишут «MUST be NULL» (обязано быть нулём), а не «Might be anything» (может быть любым). Ты ведь знаешь, почему так делает?
Это делают для того, чтобы когда параметру/полю найдут применение, и оно перестанет быть зарезервированным, система смогла быть отличать старые программы, полагающиеся на то, что у поля нет никакого назначения, от новых программ, которые используют его по новому, недавно появившемуся предназначению.
Вот эта функция как раз одна из тех счастливиц, зарезервированному аргументу которой таки придумали предназначению (большинству не везёт: зарезервированные поля и аргументы остаются навечно зарезервированными, потому что про них забывают).
В старой документации однозначно написано, что параметр зарезервирован и
должен обязан быть NULL.
В новой документации уже говорится, что у параметра появилось предназначение — передача указателя на структуру
CONSOLE_READCONSOLE_CONTROL. Правда, только для W-реализации.
Если бы автор использовал ReadConsoleW, он бы передал указатель на vbNull, а функция бы посчитала это указателем на
CONSOLE_READCONSOLE_CONTROL. И опять ему повезло: первым полем
CONSOLE_READCONSOLE_CONTROL идёт поле с длиной структуры, по которому настоящую структуру легко отличить от чего-то, по ошибке пытающегося быть похожим на структуру. А если бы не повезло?
В любом случае, в данном коде мы имеем нарушение спецификации. Написано: при использовании ANSI-версии функции передавать NULL. А нарушениям спецификации — бой.
В общем.
Использование vbNull как NULL — это та глупость, с которой я веду бой.
Передача любой фигни в качестве значения зарезервированных параметров (какая им, дескать, разница, функция всё равно на них не обращает внмания) — это ещё одна глупость, с которой я веду бой.
Последнее — вообще причина того, что с выходом новой версии ОС половина приложений перестают работать. Обыватели обвиняют новую ОС в кривости, но кривость на самом деле присуща головам тех, кто делает подобные допущения и передаёт что-попало в reserved-параметры, как здесь.
То, что в данном случае передача ByRef vbNull не приводит ни к чему плачевному и не является источником описанной проблемы — это вообще ничего не значит. Я критикую наплевательское отношение, а не конкретный код. А источник проблемы я описал позже: бесконечный цикл с попытками читать и писать в закрытые хендлы освобождённой консоли.