powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой извращенец писал MessageBoxW?
25 сообщений из 196, страница 7 из 8
Какой извращенец писал MessageBoxW?
    #39487625
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раздули из мухи слона


ТС, пользуйся на здоровье


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
LPSTR StringToAnsi(LPCWSTR lpText, int nLen)
{
//------------------------------------------- конвертирует строку из UNICODE в ANSI (память освобождает вызывающая сторона)
// lpText ------------------------------------------------------------------------ UNICODE строка для преобразования в ANSI
// nLen --------------------------------------- количество символов в строке, -1 - строка заканчивается \0, посчитать самим
// LPSTR -------------------- ANSI строка эквивалентная lpText, NULL -------- ошибка, если lpText != NULL, см. GetLastError
//*************************************************************************************************************************
	if (lpText == NULL || nLen == 0)
		return NULL;													// пустая строка

	if (nLen < 0) nLen = (int)wcslen(lpText);

	LPSTR ptrResult = (LPSTR) ::malloc(nLen + 1);						// результат (освобождает тот, кто запрашивал !!)
	if (ptrResult)
	{
		::ZeroMemory(ptrResult, nLen + 1);
		if (::WideCharToMultiByte(CP_ACP, 0, lpText, nLen, ptrResult, nLen + 1, NULL, NULL) == nLen)
			return ptrResult;
			
		::free(ptrResult);
	}
	else
		::SetLastError(ERROR_OUTOFMEMORY);

	return nullptr;
}

LPWSTR StringToUnicode(LPCSTR lpText, int nLen)
{
//------------------------------------------- конвертирует строку из ANSI в UNICODE (память освобождает вызывающая сторона)
// lpText ------------------------------------------------------------------------ ANSI строка для преобразования в UNICODE
// nLen --------------------------------------- количество символов в строке, -1 - строка заканчивается \0, посчитать самим
// LPWSTR ---------------- UNICODE строка эквивалентная lpText, NULL -------- ошибка, если lpText != NULL, см. GetLastError
//*************************************************************************************************************************
	if (lpText == NULL || nLen == 0)
		return NULL;													// пустая строка

	if (nLen < 0) nLen = (int)strlen(lpText);							// определяем кол-во символов в строке

	size_t sz_mem = (nLen + 1) * sizeof(wchar_t);						// размер буфера для UNICODE строки + /00, байт
	LPWSTR ptrResult = (LPWSTR) ::malloc(sz_mem);						// результат (освобождает тот, кто запрашивал !!)
	if (ptrResult)
	{
		::ZeroMemory(ptrResult, sz_mem);
		if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)
			return ptrResult;
			
		::free(ptrResult);
	}
	else
		::SetLastError(ERROR_OUTOFMEMORY);
	
	return nullptr;
}

LPSTR StringFromUtf8A(LPCBYTE lpBlock, int cbBlock, LPINT pnLen)
{
//------------------------------------- конвертирует UTF8-блок данных в ANSI строку (память освобождает вызывающая сторона)
// lpBlock ---------------------------------------------------------------- блок данных с UTF8 символам, NULL - вернет NULL
// cbBlock------------------------------------------------------------------------ размер lpBlock в байтах, 0 - вернет NULL
// [out] pnLen --------------------------------------- длина полученной строки, символов, NULL - не возвращать длину строки
// LPSTR -------------------- ANSI строка эквивалентная lpBlock, NULL ----------- строка пуста или ошибка, см. GetLastError
//*************************************************************************************************************************
	if (lpBlock == NULL || cbBlock == 0)
		return NULL;													// пустая строка

	LPSTR	lpResult = NULL;											// результат
	int		nLen	 = 0;												// helper

	LPWSTR ptrWide = StringFromUtf8W(lpBlock, cbBlock, &nLen);		// конвертируем через преобразование в UNICODE
	if (ptrWide)
	{
		lpResult = StringToAnsi(ptrWide, nLen);
		::free(ptrWide);
	}
	
	if (pnLen) *pnLen = nLen;
	return lpResult;
}

LPWSTR StringFromUtf8W(LPCBYTE lpBlock, int cbBlock, LPINT pnLen)
{
//---------------------------------------------- конвертирует UTF8-строку в UNICODE (память освобождает вызывающая сторона)
// lpBlock ---------------------------------------------------------------- блок данных с UTF8 символам, NULL - вернет NULL
// cbBlock------------------------------------------------------------------------ размер lpBlock в байтах, 0 - вернет NULL
// [out] pnLen --------------------------------------- длина полученной строки, символов, NULL - не возвращать длину строки
// LPWSTR ---------------- UNICODE строка эквивалентная lpBlock, NULL ----------- строка пуста или ошибка, см. GetLastError
//*************************************************************************************************************************
	if (lpBlock == NULL || cbBlock == 0)
		return NULL;													// пустая строка

	LPWSTR lpResult = NULL;												// результат
	
	// запрашиваем размер необходимого буфера, символов WCHAR
	int nLen = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (LPCCH)lpBlock, cbBlock, NULL, 0);
	if (nLen > 0)
	{
		size_t sz_mem	= (nLen + 1UL) * sizeof(WCHAR);					// размер буфера для UNICODE строки + /00, байт
		lpResult		= (LPWSTR) ::malloc(sz_mem);
		if (lpResult)
		{
			::ZeroMemory(lpResult, sz_mem);
			if (::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (LPCCH)lpBlock, cbBlock, lpResult, nLen + 1) != nLen)
			{
				::free(lpResult); lpResult = NULL; nLen = 0;
				assert(lpResult);										// ошибка
			}
		}
		else
			::SetLastError(ERROR_OUTOFMEMORY);
	}
	if (pnLen) *pnLen = nLen;
	return lpResult;
}

LPBYTE StringToUtf8A(LPCSTR lpText, int nLen, LPINT pcbSize)
{
//------------------------- конвертирует указанную строку из кодировки ANSI в UTF-8 (память освобождает вызывающая сторона)
// lpText --------------------------------------------------------------------- строка в кодировке ANSI, NULL - вернет NULL
// nLen -------------------------------------------------------------------- длина строки lpText, символов, 0 - вернет NULL
// [out] pcbSize ------------------------------- размер возвращенного блока данных, байт, NULL - не возвращать размер блока
// LPBYTE -------------------------- эквивалентная UTF-8 строка, NULL ----------- строка пуста или ошибка, см. GetLastError
//*************************************************************************************************************************
	if (lpText == NULL || nLen == 0)
		return NULL;													// пустая строка
	
	LPWSTR ptrWide = StringToUnicode(lpText, nLen);				// конвертируем через преобразование в UNICODE
	if (ptrWide)
	{
		LPBYTE pbResult = StringToUtf8W(ptrWide, nLen, pcbSize)
		::free(ptrWide);
		return pbResult;
	}
	return nullptr;
}

LPBYTE StringToUtf8W(LPCWSTR lpText, int nLen, LPINT pcbSize)
{
//----------------------- конвертирует указанную строку из кодировки UTF-16 в UTF-8 (память освобождает вызывающая сторона)
// lpText ------------------------------------------------------------------- строка в кодировке UTF-16, NULL - вернет NULL
// nLen -------------------------------------------------------------------- длина строки lpText, символов, 0 - вернет NULL
// [out] pcbSize ------------------------------- размер возвращенного блока данных, байт, NULL - не возвращать размер блока
// LPBYTE -------------------------- эквивалентная UTF-8 строка, NULL ----------- строка пуста или ошибка, см. GetLastError
//*************************************************************************************************************************
	if (lpText == NULL || nLen == 0)
		return NULL;													// пустая строка
	
	if (nLen < 0)
		nLen = (int)_tcslen(lpText);									// подразуемавается строка заканчивающаяся /0

	LPBYTE pbResult = NULL;												// результат

	// запрашивает размер буфера для сконвертированных данных
	int nRet = ::WideCharToMultiByte(CP_UTF8, 0, lpText, nLen, NULL, 0, NULL, NULL);
	if (nRet > 0)
	{
		pbResult = (LPBYTE)::malloc(nRet);
		if (pbResult)
		{
			if (::WideCharToMultiByte(CP_UTF8, 0, lpText, nLen, (LPSTR)pbResult, nRet, NULL, NULL) != nRet)
			{
				::free(pbResult); pbResult = NULL; nRet = 0;
				assert(pbResult);										// ошибка
			}
		}
		else
			::SetLastError(ERROR_OUTOFMEMORY);
	}
	if (pcbSize) *pcbSize = nRet;
	return pbResult;
}


...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487633
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumТС, пользуйся на здоровье
У него вся проблема в том что WinCE английская и там MultiByteToWideChar() не перекодирует из 1251. Но пусть попробует.

PS Sergey_rb, если будешь этот код использовать, не забудь про освобождение памяти.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487635
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TCerebrumТС, пользуйся на здоровье
У него вся проблема в том что WinCE английская и там MultiByteToWideChar() не перекодирует из 1251. Но пусть попробует.

PS Sergey_rb, если будешь этот код использовать, не забудь про освобождение памяти.

У меня получилось написать свою функцию.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487638
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

Вариант с
Код: plaintext
1.
if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)



не работает, т.к. зависит от кодовой страницы винды, т.к. CP_ACP = 1252.
В результате получаются иероглифы, которые я потом перевожу в русский текст через свою функцию
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487643
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

если получилось, то хорошо
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487663
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbКак из кодов символов UTF8 собрать строку?
К примеру код символа
Код: plaintext
1.
D090

эквивалент буквы "А"
Точно UTF-8 ? В твоих примерах выше используется юникод (он же UTF-16).

строка это массив символов, последний 0.
В юникоде так:
Код: plaintext
1.
2.
3.
4.
5.
wchar_t str[4];
str[0] = 0xD090;
str[1] = 0xD090;
str[2] = 0xD090;
str[3] = 0;


это аналогично
Код: plaintext
1.
2.
3.
wchar_t str[4] = "ААА";

А можно вместо wchar_t использовать string?
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487671
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbА можно вместо wchar_t использовать string?
Можно wstring
https://msdn.microsoft.com/en-us/library/hd5zecz6.aspx wstring A type that describes a specialization of the template class basic_string with elements of type wchar_t as a wstring.

PS Поражаюсь твоей способности оформлять посты в стиле "угадайте что я хотел сказать, сломайте себе мозг".
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487726
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devПотому, что UTF8, в отличие от UNICODE, это не кодировка символов, а некий способ представления кода символа UNICODE в виде байт-последовательности переменной длины.utf8 одна из кодировок, используемых для представлению юникодных символов.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39487734
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbА можно вместо wchar_t использовать string?
Можно wstring
https://msdn.microsoft.com/en-us/library/hd5zecz6.aspx wstring A type that describes a specialization of the template class basic_string with elements of type wchar_t as a wstring.

PS Поражаюсь твоей способности оформлять посты в стиле "угадайте что я хотел сказать, сломайте себе мозг".

Спасибо!
wstring - это то, что надо!
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488066
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovutf8 одна из кодировок, используемых для представлению юникодных символов.А я как написал? :)
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488106
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbCerebrum,

Вариант с
Код: plaintext
1.
if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)



не работает, т.к. зависит от кодовой страницы винды, т.к. CP_ACP = 1252.
В результате получаются иероглифы, которые я потом перевожу в русский текст через свою функциюНе проще ли написать программу, которая через функции WinAPI работы с реестром будет в ветке реестра
Код: plaintext
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
менять значения ключей "ACP", "MACCP" и "OEMCP" на 1251 , 10007 и 866 соответственно, а вдобавок, на всякий случай, делать подмену кодовой страницы в значении ключа "1252" на "c_1251.nls"?
Можно вообще не париться написанием программы, а воспользоваться имеющимся инструментарием и документацией:
* Windows Embedded Compact 7: How to Use the Remote Tools Framework Without KITL or ActiveSync
* Remote Tools (Compact 2013)
* Windows Embedded 8 Technical References

Нафига насиловать моСк себе и другим написанием программы, если ты, вообще, ни разу не программист?
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488112
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb
Код: plaintext
1.
if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)


а если вместо CP_ACP написать 1251?
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488113
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНе проще ли написать программу, которая через функции WinAPI работы с реестром будет в ветке реестра
Код: plaintext
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
менять значения ключей
серьёзно?
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488122
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, а в чем проблема?
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488130
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devа в чем проблема?

Программу, которая убивает всю систему одним ударом, можно написать и проще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488151
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSergey_rb
Код: plaintext
1.
if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)


а если вместо CP_ACP написать 1251?

Как я и писал, при первом параметре 1252 выдает количество перекодированных символов, при 1251 выдает 0 и соответственно пустой текст
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488154
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devSergey_rbCerebrum,

Вариант с
Код: plaintext
1.
if (::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, lpText, nLen, ptrResult, nLen + 1) == nLen)



не работает, т.к. зависит от кодовой страницы винды, т.к. CP_ACP = 1252.
В результате получаются иероглифы, которые я потом перевожу в русский текст через свою функциюНе проще ли написать программу, которая через функции WinAPI работы с реестром будет в ветке реестра
Код: plaintext
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
менять значения ключей "ACP", "MACCP" и "OEMCP" на 1251 , 10007 и 866 соответственно, а вдобавок, на всякий случай, делать подмену кодовой страницы в значении ключа "1252" на "c_1251.nls"?
Можно вообще не париться написанием программы, а воспользоваться имеющимся инструментарием и документацией:
* Windows Embedded Compact 7: How to Use the Remote Tools Framework Without KITL or ActiveSync
* Remote Tools (Compact 2013)
* Windows Embedded 8 Technical References

Нафига насиловать моСк себе и другим написанием программы, если ты, вообще, ни разу не программист?
Править реестр - это удел сисадминов, а не программистов.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488159
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, я в XP менял и ничего... Ну поедет у него отображение романской кодировки второй половины WIN1252 и чо? Всё равно все латинские буквы первой половины кодировки останутся на месте.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devя в XP менял и ничего... Ну поедет у него отображение романской кодировки второй половины
WIN1252 и чо?

Если у тебя сама винда с романской локализацией и половина программ на ней такая же - ты
будешь готов убить того, кто так сделает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488204
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, да плевать на романскую локализацию! Первая половина - ASCII, которой пишется английский текст, совпадает абсолютно у всех виндовых кодировок, а на национальную кодировку плевать!
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488206
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, плевать в том смысле, если этим КПК будут пользоваться не итальянцы, а русские.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488229
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, я даже на подозревал, что на С++ нет готовых функций перекодировок.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488233
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devDimitry Sibiryakov, да плевать на романскую локализацию! Первая половина - ASCII, которой пишется английский текст, совпадает абсолютно у всех виндовых кодировок, а на национальную кодировку плевать!

Можно было заморочиться и поставить WinCE 6.0 вместо WinCE 7.0 и не переписывать прогу на С++.
Но админы сказали, что это невозможно.
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488268
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЧестно говоря, я даже на подозревал, что на С++ нет готовых функций перекодировок.

Есть, но они тебе не понравятся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой извращенец писал MessageBoxW?
    #39488294
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbЧестно говоря, я даже на подозревал, что на С++ нет готовых функций перекодировок.

Есть, но они тебе не понравятся.


А называются они - сделай сам?
...
Рейтинг: 0 / 0
25 сообщений из 196, страница 7 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой извращенец писал MessageBoxW?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]