2015-06-01 3 views
0

Я использую это:C++ - ExpandEnvironmentStrings Давать Ошибка преобразования

char appdata[250]; 
    ExpandEnvironmentStrings("%AppData%\\\MCPCModLocator\\", appdata, 250); 

в C++ Win32, чтобы получить папку AppData на одном из моих проектов. Его работала нормально, никаких проблем. Теперь, когда мой новый проект (тот же компьютер, еще в Visual Studio 2013), когда я пытаюсь это сделать, я получаю сообщение об ошибке в первой строке, в которой «const char * несовместим с типом LPCWSTR», а во втором параметре «char» * несовместим с типом LPWSTR ". Я понятия не имею, почему он работает над первым проектом, но не вторым. Я предполагаю, что это изменение настроек, но, просматривая настройки каждого проекта, я ничего не вижу. Любая помощь приветствуется! Благодаря!

+0

Не переуплотывайте '250'. –

ответ

3

По умолчанию вновь созданный проект в VS2013 был настроен на использование Unicode API, которые используют LPWSTR (или, wchar_t *) вместо LPSTR (или char *).

Вы можете вызвать старые API-интерфейсы ANSI, добавив «A» в конце имени функции явно, например. ExpandEnvironmentStringsA или измените конфигурацию проекта, чтобы использовать многобайтовый набор символов (страницы свойств проекта -> свойства конфигурации -> общий -> набор символов)

+0

То, что я искал! Благодаря! – dogger20011

+1

@ dogger20011 Чтобы работать со старым кодом, я думаю, что изменение конфигурации на использование ANSI API стоит меньше труда. Но я лично рекомендую API-интерфейсы в стиле юникода для нового написанного кода (или, используя макрос TEXT, для адаптации литерала к API ANSI и UNICODE. Но имейте в виду, что некоторые API не имеют стиля ANSI). Кстати, макрос CT2A (EX) и CT2W (EX) можно использовать для преобразования между unicode и ansi-строками, если ATL используется в вашем проекте, или WideCharToMultiByte и MultiByteToWideChar, если ATL не используется в вашем проекте. – Sorayuki

5

ExpandEnvironmentStrings макрос, который расширяется до ExpandEnvironmentStringsA или ExpandEnvironmentStringsW в зависимости от того, был определен ли UNICODE, когда вы включили <windows.h>.

В проекте Visual Studio UNICODE определяется по умолчанию, но это не так для использования компилятором в командной строке.

Поскольку современные программирования для Windows лучше основано на Unicode, лучше исправить не удалить определение UNICODE но добавить L префикс к вашим литералам, как L"Hello", что делает его “ широкого ” wchar_t основы буквальные, и соответственно, изменить тип appdata.

+0

Отличное объяснение! Спасибо! – dogger20011

Смежные вопросы