Я разрабатываю Win32 API Wrapper.Чтобы сделать его Unicode-совместимым, я делаю следующее:
#ifndef UNICODE
#define gchar char
#define gstrcpy strcpy
#define gstrncpy strncpy
#define gstrlen strlen
#define gstrcat strcat
#define gstrncat strncat
#define gstrcmp strcmp
#define gstrtok strtok
#else
#define gchar wchar_t
#define gstrcpy lstrcpy
#define gstrncpy lstrncpy
#define gstrlen lstrlen
#define gstrcat lstrcat
#define gstrncat lstrncat
#define gstrcmp lstrcmp
#define gstrtok lstrtok
#endif
Я также предоставляю
#define uni(s) TEXT(s)
Мой тест состоял из окна, которое создает окно сообщения через
msg (uni("Left-click"));
всякий раз, когда пользователь щелкает левой кнопкой мыши по окну.Проблема заключается в том, что независимо от того, сколько сообщений создано, после того, как 4 или 5 из этих сообщений будут закрыты, когда я #define UNICODE, будет показано следующее окно сообщения, будь то новое или то, которое находится под последним закрытым, вызываетпрограмма для возврата 0xC0000005.Не определение UNICODE сделает эту работу отлично.Моя функция msg выглядит следующим образом:
dword msg (cstr = uni(""), cstr = uni(""), hwin = null, dword = 0);
...
dword msg (cstr lpText, cstr lpCaption, hwin hWnd, dword uType)
{
return MessageBox (hWnd, lpText, lpCaption, uType);
}
, где dword - это DWORD, cstr - это pchar, который является gchar *, который может быть char * или wchar_t *, hwin - HWND, а null - 0.
Вероятно, это не окно сообщения, которое делает это, но я не делал ничего другого, связанного с текстом, с тестированием, поэтому я посмотрю, не выйдет ли оно иным способом.
Кто-нибудь знает, почему это произойдет?Разница между символами MB и юникодом не должна вызывать многократный сбой программы.При необходимости я могу также загрузить заголовки и тест.
Редактировать: Я только что обнаружил, что создание одного сообщения, а затем закрытие фактического окна приведет к тому же самому сбою. SOURCE CODE Вот ссылка на источник.Пожалуйста, имейте в виду: а) Я когда-либо проходил только один курс программирования первого года обучения (C ++).б) Цель моей обертки - сделать написание приложений win32 как можно проще.c) Мне нравится создавать свои собственные вещи (класс строк и т. д.).
Тоже забыл об этом (дух), я использую Code :: Blocks (MinGW).
Редактировать: Iраньше не понимал, но программа пытается получить доступ к памяти по адресу 0x00000000.Это то, что вызывает проблему, но я понятия не имею, почему он пытается это сделать.Я полагаю, что инструкция, пытающаяся получить к нему доступ, находится где-то в winnt.dll, но так и не научившись отлаживать, я все еще пытаюсь выяснить, как найти нужную мне информацию.
Редактировать: Теперь,не изменяя его, но выполняя его на другом компьютере, он ссылается на 0x7a797877 вместо 0.
Редактировать: изменение оконной процедуры для включения WM_LBUTTONDOWN
и вызова msg()
внутри вместо вызова добавленной процедуры приводит кпрограмма работает отлично.Что-то с кодированием addmsg()
и оконной процедурой приводит к тому, что _lpWindowName и _lpClassName через некоторое время повредили данные, но элементы без указателя все еще сохраняются.
РЕДАКТИРОВАТЬ: После всего этогохаос Я наконец узнал, что мне не хватает одного символа во всем моем исходном коде.Когда я определил msgparams
как Window, UINT, WPARAM, LPARAM
и аналогично с msgfillparams
(кроме имен), я забыл передать ссылку.Я передавал Окно по значению!Я все еще хотел бы поблагодарить всех, кто написал, так как я получил удар по заднице в отладчике и закончил тем, что узнал намного больше о Юникоде.