Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Unicode-функции в Win32

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Говорят (в том числе и Д. Рихтер), что в Win32 есть 2 вида функций: те, что используют ASCII и те, что Unicode. Первые имеют в имени суффикс A, вторые - W. Я вызывал функцию CreateWindowExW, передавая туда строчки Unicode. Однако мое окно имело заголовок всего из одной, первой буквы, т. е. эта Unicode-функция действует как ASCII. Она почему-то обрабатывала строку побайтно, встречала во втором байте 0 (это нормально для Unicode, конец строки - это два нулевых байта подряд (слово)) и принимала его за конец строки! Проблема была решена добавлением
 
#define UNICODE
 
Компилятор - Borland C++Builder 6.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:29 30-07-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ты для начала сказал бы широкой апщественности
1) под какой OS ты поимел сей трабл. Win95 & Win98 Unicode не поддерживают
2) кусок кода бы привел. мало ли ты так чего накосячил - нам отсюда плохо видно

----------
помни - ты с потрохами принадлежишь государству

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 11:16 30-07-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
To redp
 
И поумнее тебя есть, да в Крестах сидят. (С) МУР.
 
Это не оскорбление, а просто цитата.
 
Участок кода самый простой:
 
const wchar_t* name = L"The program";
//...
HWND hWnd = CreateWindowExW(0, name, name, /* ... */);
 
Можно еще попробовать
 
SetWindowTextW(hWnd, name);
 
Эффект всегда один. ОС - Windows 2000 Professional, компилятор - bcc32.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 17:45 30-07-2004
ssx



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
мда. ты посмотри как объявлены функциивзял первую попавшуюся)
WINUSERAPI
HDESK
WINAPI
CreateDesktopA(
    IN LPCSTR lpszDesktop,
    IN LPCSTR lpszDevice,
    IN LPDEVMODEA pDevmode,
    IN DWORD dwFlags,
    IN ACCESS_MASK dwDesiredAccess,
    IN LPSECURITY_ATTRIBUTES lpsa);
WINUSERAPI
HDESK
WINAPI
CreateDesktopW(
    IN LPCWSTR lpszDesktop,
    IN LPCWSTR lpszDevice,
    IN LPDEVMODEW pDevmode,
    IN DWORD dwFlags,
    IN ACCESS_MASK dwDesiredAccess,
    IN LPSECURITY_ATTRIBUTES lpsa);
#ifdef UNICODE
#define CreateDesktop  CreateDesktopW
#else
#define CreateDesktop  CreateDesktopA
#endif // !UNICODE
то есть от того, есть или нет #define UNICODE зависит, какая из них будет использоваться. А в проге своей пиши просто CreateDesktop (без A и W)

Всего записей: 500 | Зарегистр. 06-10-2003 | Отправлено: 18:33 30-07-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извините, я взял не первую попавшуюся. Я специально выбрал CreateWindowExW, поскольку для нее все эти LPCTSTR раскрываются в конечном итоге в const wchar_t* (во всяком случае, так пишет компилятор). У меня с головой все в порядке, и под Win32 я пишу уже 5 лет, из них 3 - частично или полностью на API (без библиотек). Мне известно, что функции CreateWindowEx не существует - это всего лишь макрос. Но почему правильно вызванная функция с параметорм типа LPCWSTR правильно компилируется, но работает как ANSI? Какая разница, делаю я #define UNICODE или нет, если я явно выбираю функцию?

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:57 31-07-2004
ssx



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Мне известно, что функции CreateWindowEx не существует - это всего лишь макрос.

может наоборот, CreateWindow - это макрос?
#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)

Всего записей: 500 | Зарегистр. 06-10-2003 | Отправлено: 12:51 31-07-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
To ssx
 
Дорогой сэр, читайте внимательно!
 
Функции CreateWindowEx действительно не существует - это всего лишь макрос, который раскрывается в CreateWindowExA или CreateWindowExW в зависимости от настроек и директив препроцессора.  
 
Почитайте ваше же первое сообщение: CreateDesktop - это макрос, раскрывающийся в CreateDesktopA или CreateDesktopW. C CreateWindowEx та же ситуация.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:43 01-08-2004
OldGopher



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А как был оформлен класс окна? Там могут возникнуть перекрывания имен...
 
Можно кусок кода начальной инициализации класса и окна целиком?

Всего записей: 3802 | Зарегистр. 25-10-2001 | Отправлено: 09:30 01-08-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По всем признакам, это фирменная фича борландовского компилятора. У меня приведенный ниже код работает нормально:

Код:
 
#include<windows.h>
 
 
int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
{
wchar_t* text = L"The text";
HWND hWnd = FindWindow(NULL,"Калькулятор");
if(hWnd)
{
SetWindowTextW(hWnd,text);
}
return(0);
}
 

ЗЫ: Используется MSVC 6.0, операционная система - Win2K

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 08:13 02-08-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
По всем признакам, это фирменная фича борландовского компилятора.

 
А можно поподробнее? Что за фича?

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:24 02-08-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имелось в виду - неадекватное поведение компилятора. Иными причинами это объяснить довольно сложно.

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 08:50 02-08-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не знаю, как у вас, а вот это
 
  s:=widestring(#$043D)+widestring(#$043E)+widestring(#$043F);
  hw:=createwindowW('BUTTON',s,WS_TILEDWINDOW+WS_VISIBLE,10,10,200,200,Form1.Handle,0,0,nil);
 
прекрасно работает...

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 11:43 02-08-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion

Цитата:
И поумнее тебя есть, да в Крестах сидят. (С) МУР.  

Ик
Чемпион по сидению в Крестах ?
это не оскорбление - просто вопрос

----------
помни - ты с потрохами принадлежишь государству

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 11:56 02-08-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для тех, кто сомневается в моих интеллектуальных способностях, и особенно redp, привожу целиком исходных код:
 
#define UNICODE
#include <windows.h>
#include <windowsx.h>
#pragma hdrstop
//------------------------------------------------------------------------------
const wchar_t* DemoName = L"DemoClass";
const wchar_t* DemoCaption = L"The Demo by Ilias";
//------------------------------------------------------------------------------
bool RegisterDemo(HINSTANCE);
HWND CreateDemo(HINSTANCE, int);
LRESULT CALLBACK Demo_WndProc(HWND, UINT, WPARAM, LPARAM);
void Demo_OnDestroy(HWND);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  if(!RegisterDemo(hInstance))
    return 1;
  if(!CreateDemo(hInstance, nCmdShow))
    return 2;
  BOOL res;
  MSG msg;
  while((res = GetMessage(&msg, 0, 0, 0)) && (res != -1))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return 0;
}
//------------------------------------------------------------------------------
// RegisterDemo
//------------------------------------------------------------------------------
bool RegisterDemo(HINSTANCE hInst)
{
  WNDCLASSEXW wcl;
  wcl.cbSize = sizeof(WNDCLASSEX);
  wcl.style = CS_HREDRAW | CS_VREDRAW;
  wcl.lpfnWndProc = Demo_WndProc;
  wcl.cbClsExtra = 0;
  wcl.cbWndExtra = 0;
  wcl.hInstance = hInst;
  wcl.hIcon = LoadIcon(0, IDI_WINLOGO);
  wcl.hCursor = LoadCursor(0, IDC_ARROW);
  wcl.hbrBackground = CreateSolidBrush(0x0000FFFF);
  wcl.lpszMenuName = 0;
  wcl.lpszClassName = DemoName;
  wcl.hIconSm = 0;
  return RegisterClassExW(&wcl);
}
//------------------------------------------------------------------------------
// CreateDemo
//------------------------------------------------------------------------------
HWND CreateDemo(HINSTANCE hInst, int nCmdShow)
{
  HWND hWnd = CreateWindowExW(0, DemoName, DemoCaption, WS_OVERLAPPEDWINDOW, 100, 100, 400, 300, 0, 0, hInst, 0);
  if(hWnd)
  {
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
  }
  return hWnd;
}
//------------------------------------------------------------------------------
// Demo_WndProc
//------------------------------------------------------------------------------
LRESULT CALLBACK Demo_WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  switch(Message)
  {
    HANDLE_MSG(hWnd, WM_DESTROY, Demo_OnDestroy);
    default:
      return DefWindowProc(hWnd, Message, wParam, lParam);
  }
}
//------------------------------------------------------------------------------
// Demo_OnDestroy
//------------------------------------------------------------------------------
void Demo_OnDestroy(HWND)
{
  PostQuitMessage(0);
}
//------------------------------------------------------------------------------
 
Все работает отлично, а если убрать #define UNICODE - просто работает.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:50 03-08-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
 

Цитата:
switch(Message)  
  {  
    HANDLE_MSG(hWnd, WM_DESTROY, Demo_OnDestroy);  
    default:  
      return DefWindowProc(hWnd, Message, wParam, lParam);  
  }  

замени на
return DefWindowProcW(hWnd, Message, wParam, lParam);

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 11:16 03-08-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Цитата:
Цитата:
 
switch(Message)
{
HANDLE_MSG(hWnd, WM_DESTROY, Demo_OnDestroy);
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
}

 
замени на
return DefWindowProcW(hWnd, Message, wParam, lParam);

 
А это еще зачем? DefWindowProc корректно обрабатывает WM_DESTROY  и вызывает PostQuitMessage()?

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:25 04-08-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion

Цитата:
А это еще зачем?

Может я не корректно выразился - имелось ввиду имя функции DefWindowProc заменить на DefWindowProcW
- во-первых с этим работает,  
во-вторых если уж ставим W в окончаниях, то это нужно делать везде, где нужно, а не только там, где хочется
в-третьих обычно совет сначала пробуют (я пол-часа ради этого сидел), а потом критикуют  
----
при всем уважении - нужно быть чуть вежливее (и в отношении redp),  особенно когда Вам пытаются помочь

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 10:17 04-08-2004 | Исправлено: WiseAlex, 10:27 04-08-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
вот-вот... бьешься для кого-нить, а они хаят потом хорошо хоть редко такое бывает

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 11:19 04-08-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
To WiseAlex
 
Извините, я не совсем внимательно прочитал то, что вы предлагали, однако в другой раз не пишите "замени блок кода этой функцией", подразумевая замену функции функцией. Пишите так, чтобы не возникало двусмысленности, хотя я понимаю, что если приказ может быть понят неправильно, он будет понят неправильно.
 
Насчет redp - он первый начал, а когда появился код, его и нет.
 
В третьих, спасибо за решение. Я его еще не проверил, но, видимо, оно правильное, т. к. не аппелирует к "глюкам винды" или "кривому компилятору", ваши доводы логичны.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:31 05-08-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Unicode-функции в Win32


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru