Почему у GetWindowLong есть варианты ANSI и Unicode? - PullRequest
4 голосов
/ 27 января 2012

Сегодня я узнал, что у GetWindowLongGetWindowLongPtr) есть варианты 'ANSI' (A) и 'Unicode' (W), даже если они не имеют аргументов TSTR. Страница MSDN на GetWindowLong указывает только на то, что эти варианты существуют, но не указывает, почему.

Я могу себе представить, что он должен соответствовать кодировке CreateWindowEx (которая также имеет A / W ароматы) или RegisterClass, но по многим причинам я не думаю, что это имеет смысл. Очевидно, это имеет значение, потому что кто-то сообщил, что версия Unicode может не работать на XP (даже если XP - это NT, и, насколько я понимаю, весь Unicode под капотом). Я также попытался разобрать 32-битную версию USER32.DLL (которая содержит оба варианта GetWindowLong), и была проделана дополнительная работа, основанная на некоторой очевидной разнице в кодировке *.

Какую функцию я должен выбрать?


* Ароматы GetWindowLong идентичны, за исключением логического значения, которое они передают другим функциям. Это логическое значение сравнивается с битом флага в структуре памяти, которую я не могу отследить с помощью статического анализа кода.

1 Ответ

7 голосов
/ 27 января 2012

Я полагаю, что причина объяснена в статье Рэймонда Чена, Что это за странные значения, возвращаемые из GWLP_WNDPROC?

Если текущая оконная процедура несовместима с вызывающей стороной GetWindowLongPtr, тогда указатель реальной функции не может быть возвращен, поскольку вы не можете вызвать его. Вместо этого возвращается «волшебное печенье». Единственная цель этого файла cookie - распознавать его с помощью CallWindowProc, чтобы он мог преобразовать параметры сообщения в формат, ожидаемый оконной процедурой.

Например, предположим, что вы работаете в Windows XP, и окно является окном UNICODE, но компонент, скомпилированный как ANSI, вызывает GetWindowLong (hwnd, GWL_WNDPROC). Невозможно вернуть необработанную оконную процедуру, поскольку вызывающая сторона использует оконные сообщения ANSI, но оконная процедура ожидает оконные сообщения UNICODE. Поэтому вместо этого возвращается волшебное печенье. Когда вы передаете этот волшебный файл cookie в CallWindowProc, он распознает его как «О, мне нужно преобразовать сообщение из ANSI в UNICODE, а затем передать сообщение UNICODE этой оконной процедуре».

...