2014-09-24 5 views
0

Я застрял с ошибкой в ​​компиляторе QT, однако он отлично работает с VS2010. ошибка указывает, что Я видел другие сообщения, связанные с одной и той же ошибкой, но не разрешил мою проблему в QT. Я попытался _t, L или TEXT, но все еще не работаетне может преобразовать cont char * в LPCWSTR

bq. error: C2664: 'HANDLE LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT)' : cannot convert argument 2 from 'const char *' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

мой код, как показано ниже

Bitmap::Bitmap(std::string const& file_name) { 
bitmap_ = static_cast<HBITMAP>(::LoadImage(0, file_name.c_str(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION)); 
} 

пожалуйста, поделитесь, если у вас есть какие-либо идеи, чтобы решить эту проблему

+0

Вы компилировать с UNICODE макро определяется, выключите его, если вы действительно верю, что вы можете жить без UNICODE :) –

+0

use std :: wstring – paulm

ответ

3

Qt не включает в себя компилятор. В Windows вы, вероятно, либо компилируете с помощью mingw или Visual C++. В любом случае проблема заключается в том, что вы вызываете функцию, которая ожидает широкую строку символов, но вы пытаетесь передать ей 8-битную строку символов.

По соображениям совместимости, Win32 uses a different set of API functions if you have _UNICODE defined. В вашем случае у вас определен _UNICODE. Вы можете продолжить использовать 8-разрядную std :: string, но просто измените метод с LoadImage() to LoadImageA(). Или, если вы не возражаете изменить свой класс Bitmap, вы можете переключиться с std :: string на std :: wstring, чтобы воспользоваться функциями Unicode Windows.

Но, возможно, более важный вопрос: зачем использовать Win32 для загрузки растровых изображений и std :: string, если вы используете Qt? Qt's QImage class и QString class предоставляют полнофункциональные кросс-платформенные строки и загрузчики изображений. Как и любая всеобъемлющая структура, Qt работает лучше всего, если вы используете только внешние функции по мере необходимости.

0

Я не уверен, если этот метод является лучшим, но я использовал их на своих проектах, и она отлично работает, см:

char *source = "Hello world"; 
WCHAR target[size]; 
MultiByteToWideChar(CP_ACP, 0, source, -1, target, size); 
LPCWSTR final = target; 

MessageBox(0, final, TEXT("title"), 0); //Sample usage 
Смежные вопросы