http://bugs.winehq.org/show_bug.cgi?id=7512
------- Additional Comments From dmda@yandex.ru 2007-11-07 03:41 ------- in my case the code is
ComboHandle = CreateWindowExW(0, L"COMBOBOX", 0, 0x44210242, 55, 30, 190, 21, ParentWnd, 0, HInstance, 0); ShowWindow(ComboHandle, SW_NORMAL);
// 3rd party library begins: EditHandle = GetWindow(ComboHandle, GW_CHILD); DefEditProc = GetWindowLongA(EditHandle, GWL_WNDPROC); SetWindowLongA(EditHandle, GWL_WNDPROC, DefEditProc); // 3rd party library end. SetWindowLongW(EditHandle, GWL_WNDPROC, GetWindowLong(EditHandle, GWL_WNDPROC)); // this call is a fixup to trigger EditHandle into unicode and ... SetWindowTextW(ComboHandle, L"Any Text"); // will display only "A"
It works fine under Windows. Indeed, SetWindowLongA() turns handler to non- unicode WNDPROC and next call to SetWindowLongW() returns it back to unicode. Windows recognizes it per following: Even if you call SetWindowLongA() and provide NULL WndProc or WndProc pointing to USER32 class handler, it will become/stay UNICODE If you call SetWindowLongA() and provide custom WndProc, it will become ANSI If you call SetWindowLongW() and provide any WndProc it will become UNICODE
Under Wine it looks pretty similar and according to IsWindowUnicode() HANDLE becomes first non-uncode then returns back to unicode mode, but it stops processing SetWindowTextW() as unicode and expects ANSI string passed to this function. Definitely it's a bug in Wine :-)