2016-08-02 4 views
3

Честное слово, я сейчас схожу с ума. Позвольте мне начать с того, что функция MessageBox отлично работает в CodeBlocks, когда я определяю текст внутри него и что-нет; но по какой-то причине Visual Studio настолько разборчива, что может войти в эту функцию MessageBox.Почему мой ящик сообщений отображается на другом языке?

Он продолжал говорить мне, что все, что я вложил внутрь, было недействительным для «вещи» LPCWSTR. Чтобы обойти это, я запрограммировал эту вещь ниже:

int main() 
{ 
LPCWSTR a; 
std::string s = "Please help me."; 
a = (LPCWSTR)s.c_str(); 

LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

    MessageBox(0,a,b, MB_OK | MB_ICONSTOP); 
} 

Вместо того, чтобы он работал, как я первоначально думал, что это будет, вместо этого я получил это в результате:

Image

Это очень напряженный для я и я знаю, что это было задано еще раз здесь, поэтому, пожалуйста, не ставьте мой вопрос как дубликат. Как заставить этот код работать, поэтому мое сообщение появляется на английском языке и изображает то, что я пытаюсь сказать четко?

Благодаря загодя,

МТС

+0

'MessageBox' принимает аргументы' LPCTSTR', но вы даете ему 'LPCWSTR'. Попробуйте объявить/кастинг 'a' и' b' как 'LPCTSTR' вместо этого? – Doc

+0

@Doc a) Если MessageBox становится MessageBoxA или MessageBoxW зависит от настроек проекта/материала препроцессора. б) Кастинг не помогает. c) С выходом на японском языке это вариант W. – deviantfan

ответ

7

Причина, почему он показывает на другом языке (и, как правило, это бред на языке вы видите) является то, что вы заливка строки введите вместо того, чтобы использовать правильный тип строки:

LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

Этот код делает не превратить узкую строку на основе ANSI в широкую строку. Кастинг не Преобразование типов строк. Если вы удалили бросок, вы увидите, что компилятор дает вам ошибку, которая не соответствует типам строк/указателям.

Поскольку вы используете функцию MessageBox, это на самом деле вызов MessageBoxW, для которого требуются широкие строковые аргументы.

Причина в вашем случае, почему MessageBoxW называется то, что MessageBox будет либо MessageBoxA или MessageBoxW, в зависимости от типа сборки (MBCS или Unicode, соответственно). Для CodeBlocks у вас, вероятно, был настроен ваш проект как MBCS, а на Visual Studio он настроен как Unicode, поэтому он работал для одного проекта и с ошибкой с другой.

Таким образом, исправление, чтобы обеспечить широкие строки в этом случае:

LPCWSTR b; 
std::wstring t = L"MTS"; 
b = t.c_str(); 

или даже это:

LPCWSTR b; 
std::basic_string<WCHAR> t = L"MTS"; 
b = t.c_str(); 

Если вы хотите иметь один и тот же код работает как для MBCS и Unicode строит без изменений кодирования, можно также использовать следующее:

#include <tchar.h> 
//... 
LPCTSTR b; 
std::basic_string<TCHAR> t = _T("MTS"); 
b = t.c_str(); 

Использует макрос _T (или TEXT), чтобы сделать строковый литерал узким или широким, в зависимости от типа сборки. TCHAR будет либо узким, либо широким, в зависимости от типа сборки.


Суть заключается в следующем - если вы вызываете функцию, которая требует строки, и компилятор выдаст ошибку, что строковые типы не совпадают, делать не попробовать слепки C-стиле «исправить» ошибку компилятора. Это особенно характерно для строк. Вместо этого, либо

1) Обеспечить правильные типы строк, так что отливка никогда не нужна,

или

2) Вызов правильной функции (в данном случае MessageBoxA), который принимает ваши типы строк без необходимости применять броски.

+0

Спасибо, человек тон, это заводило меня орехами – MTS