Если создать окно с помощью CreateWindowExA (тот же Edit, например), то такое окно не будет понимать уникода
Товарищи, вы заблудились в трех соснах. Простая логика подсказывает, что раз из ядра для создания окон на нас смотрит всего один сервис (NtUserCreateWindowEx), то и окна будут создаваться все одинаковые с точки зрения наличия юникода. Я же говорю, есть вопрос - загляни в IDA. Я заглянул и вот что там увидел:
Это код CreateWindowExA
- Код: Выделить всё
.text:77D1E18A mov edi, edi
.text:77D1E18C push ebp
.text:77D1E18D mov ebp, esp
.text:77D1E18F push 40000001h ; int
.text:77D1E194 push [ebp+lpParam] ; int
.text:77D1E197 push [ebp+hInstance] ; int
.text:77D1E19A push [ebp+hMenu] ; int
.text:77D1E19D push [ebp+hWndParent] ; int
.text:77D1E1A0 push [ebp+nHeight] ; int
.text:77D1E1A3 push [ebp+nWidth] ; int
.text:77D1E1A6 push [ebp+Y] ; int
.text:77D1E1A9 push [ebp+X] ; int
.text:77D1E1AC push [ebp+dwStyle] ; int
.text:77D1E1AF push [ebp+lpWindowName] ; int
.text:77D1E1B2 push [ebp+lpClassName] ; hMenu
.text:77D1E1B5 push [ebp+dwExStyle] ; int
.text:77D1E1B8 call __CreateWindowEx@52 ; _CreateWindowEx(x,x,x,x,x,x,x,x,x,x,x,x,x)
.text:77D1E1BD pop ebp
.text:77D1E1BE retn 30h
А это CreateWindowExW
- Код: Выделить всё
.text:77D20E51 mov edi, edi
.text:77D20E53 push ebp
.text:77D20E54 mov ebp, esp
.text:77D20E56 push 40000000h ; int
.text:77D20E5B push [ebp+lpParam] ; int
.text:77D20E5E push [ebp+hInstance] ; int
.text:77D20E61 push [ebp+hMenu] ; int
.text:77D20E64 push [ebp+hWndParent] ; int
.text:77D20E67 push [ebp+nHeight] ; int
.text:77D20E6A push [ebp+nWidth] ; int
.text:77D20E6D push [ebp+Y] ; int
.text:77D20E70 push [ebp+X] ; int
.text:77D20E73 push [ebp+dwStyle] ; int
.text:77D20E76 push [ebp+lpWindowName] ; int
.text:77D20E79 push [ebp+lpClassName] ; hMenu
.text:77D20E7C push [ebp+dwExStyle] ; int
.text:77D20E7F call __CreateWindowEx@52 ; _CreateWindowEx(x,x,x,x,x,x,x,x,x,x,x,x,x)
.text:77D20E84 pop ebp
.text:77D20E85 retn 30h
Как говорится, найдите 10 отличий

А отличие всего одно - это флаги , передающиеся во внутреннюю _CreateWindowEx(). Я предположил, что единичка в младшем слове говорит о том, что работа сейчас идет с ANSI-строкой заголовка и её нужно будет преобразовать к юникоду. Проверим предположение, заглянем внутрь _CreateWindowEx():
- Код: Выделить всё
.text:77D20DC9 mov ebx, [ebp+arg_30] <-- Флаги ложатся в ebx
.text:77D20DCC and [ebp+arg_8], 0
.text:77D20DD0 test bl, 1 <-- Проверяется младшее слово
.text:77D20DD3 jnz loc_77D1E1C1
Если флаги говорят об использовании ANSI-строки, то управление передается по адресу 77D1E1C1. Что там у нас?
- Код: Выделить всё
.text:77D1E1C1 loc_77D1E1C1: ; CODE XREF: _CreateWindowEx(x,x,x,x,x,x,x,x,x,x,x,x,x)+62j
.text:77D1E1C1 or [ebp+arg_0], 80000000h
.text:77D1E1C8 test edi, 0FFFF0000h
.text:77D1E1CE jz short loc_77D1E1DF
.text:77D1E1D0 push 1
.text:77D1E1D2 push edi
.text:77D1E1D3 lea eax, [ebp+var_28]
.text:77D1E1D6 push eax
.text:77D1E1D7 call _RtlCaptureLargeAnsiString@12 ; RtlCaptureLargeAnsiString(x,x,x)
.text:77D1E1DC mov edi, [ebp+var_1C]
.text:77D1E1DF
.text:77D1E1DF loc_77D1E1DF: ; CODE XREF: _CreateWindowEx(x,x,x,x,x,x,x,x,x,x,x,x,x)-2BA3j
.text:77D1E1DF test esi, esi
.text:77D1E1E1 jz loc_77D20DF8
.text:77D1E1E7 cmp byte ptr [esi], 0FFh
.text:77D1E1EA jz loc_77D54314
.text:77D1E1F0 push 0FFFFFFFFh
.text:77D1E1F2 push esi
.text:77D1E1F3 lea eax, [ebp+var_14]
.text:77D1E1F6 push eax
.text:77D1E1F7 call _RtlInitLargeAnsiString@12 ; RtlInitLargeAnsiString(x,x,x)
.text:77D1E1FC jmp loc_77D20E88
Хоть функции, что мы видим, и недокументированы, но по их названиям и этому коду можно понять, что тут происходит преобразование ANSI-строки в UNICODE. Т.е. мы приходим к выводу, что разница в W и A вариантах этих функций практически отсутствует и заключается лишь в дополнительном преобразовании строк.
А теперь домашнее задание: опровергните слова
jangle и докажите аналогичным методом, что A и W вариант функции SendMessage ведут себя абсолютно одинаково.

ЗЫ.:
Хотя уникодный заголовок для диалога открытия файлов у меня отлично передала и обычная SendMessageA (откуда, собственно, вопрос и возник), но по WM_SETTEXT, действительно, А-версия передать уникодный текст не смогла.
Почему текст не установился с помощью WM_SETTEXT сказать не могу, кода не видел. Но вот то, что A-вариант прекрасно передает и юникодные строки - правда чистой воды, ибо SendMessage вообще не знает что она передает, указатель на строку или просто число. Все зависит только от приемщика сообщения!!!
А я все практикую лечение травами...