2016-09-27 11 views
0

Я работаю над простым проектом с DirectX9. У меня есть небольшая проблема с некоторыми преобразованиями типов данных, и я провел некоторые исследования, но не нашел ничего особенно полезного. Давайте начнем с кодом:LPCWSTR to char * и наоборот

LPDIRECT3DSURFACE9 LoadSurface(char *fileName, D3DCOLOR transColor) 
{ 
LPDIRECT3DSURFACE9 image = NULL; 
D3DXIMAGE_INFO info; 
HRESULT result; 

result = D3DXGetImageInfoFromFile(fileName, &info); 
if (result != D3D_OK) return NULL; 

result = d3ddev->CreateOffscreenPlainSurface(
    info.Width,   //width of the surface 
    info.Height,  //height of the surface 
    D3DFMT_X8R8G8B8, //surface format 
    D3DPOOL_DEFAULT, //memory pool use 
    &image,    //reference to image 
    NULL);    //reserved - ALWAYS NULL 

//make sure file loaded properly 
if (result != D3D_OK) return NULL; 

return image; 

} 

В строке 6, я получаю сообщение об ошибке в переменной FileName:

IntelliSense: аргумент типа «символ *» несовместим с параметром типа «LPCWSTR»

Я также получить точно такое же сообщение об ошибке на втором и третьем параметрах при попытке использовать MessageBox-х:

if (d3ddev == NULL) 
{ 
MessageBox(hWnd, "Error Creating Direct3D Device", "Error", MB_ICONERROR); 
return 0; 
} 

Я использовал код в точности как этот БЭФ руды и проблем не было. Не знаю, что происходит - особенно потому, что LPCWSTR и char * - это, по сути, одно и то же ...

Любая помощь приветствуется! Спасибо

+1

LPCSTR и char * я могу согласиться, LPCWSTR хотя? нет. – Borgleader

+6

* Не знаю, что происходит - особенно потому, что LPCWSTR и char * - это, по сути, одно и то же. * - ** Нет, они не являются ** – PaulMcKenzie

+1

[Этот вопрос/вопрос] (http://stackoverflow.com/questions/3924926/can not-convert-parameter-1-from-char-to-lpcwstr? Rq = 1) может ответить на ваш вопрос. (Посмотрите на второй ответ, измените конфигурацию проекта, чтобы API не ожидали unicode). – alain

ответ

4

Наиболее вероятная причина, по которой у вас возникли проблемы, заключается в том, что вы включили юникод в настройках проекта Visual C++. Смотрите принятый ответ здесь, чтобы включить его снова (если это возможно для вас): How do I turn off Unicode in a VC++ project?

В противном случае вам нужно конвертировать char * в wchar_t * используя MultiByteToWideChar function.

3

Я использовал код точно так же, как раньше, и не имел проблем.

Нет, у вас его нет.

LPCWSTR и символ *, по существу, то же самое ...

Нет, это не так.

Если вы читаете the documentation, вы увидите, что LPCWSTR является const wchar_t*.

Вместо этого вы должны взять const wchar_t*.

Если вы действительно хотите преобразовать в char*, и не важно, что (по крайней мере в одном из двух направлений), это не имеет смысла, то вы можете прочитать ответы на следующие вопросы:

& hellip; и затем подайте const_cast. Но, серьезно, пожалуйста, не надо.

1

Выяснил это, просмотрев файлы заголовков DirectX ...Если кто-то, имеющий такую ​​же проблему, а не с помощью:

D3DXGetImageInfoFromFile(varName, &info); 

Вместо использования:

D3DXGetImageInfoFromFileA(varName, &info); 

То же самое касается MessageBox в ... Используйте

MessageBoxA(handleVar, messageVar, titleVar, iconType);  

* Это приходит с предостережение о том, что параметры вашего свойства проекта для наборов символов установлены в Unicode. Это становится ненужным, если вы переключите его на многобайтовый.

Как всегда, благодаря тем, которые действительно способствовали и помогли мне в этом; и нет. Спасибо тем, кто просто публикует на досках, чтобы высмеять или унизить тех, кто менее опытен, - большое использование вашего времени.

+3

Да, это работает, но это плохая идея. Измените настройку проекта, чтобы использовать API 'char'. ('D3DXGetImageInfoFromFile' - это макрос, который разрешает' D3DXGetImageInfoFromFileW' или 'D3DXGetImageInfoFromFileA', в зависимости от' UNICODE') – alain

+1

Я думаю, вы должны добавить к этому ответу, почему вы хотите явно использовать узкую версию Win32 API для xyzA? широкой версии или опубликованного и задокументированного имени. – Niall

+0

Как заметил кто-то, и я полностью упустил из виду, настройки проекта были установлены как Unicode, а не Multibyte. Простите меня. Прошло почти год с тех пор, как я использовал DirectX ... Я все еще помню все небольшие хитрости, которые мне нужно сделать в настройках. Ошибки новичков. Спасибо за вашу помощь всем!! –