#c #winapi #unicode
#c #winapi #unicode
Вопрос:
всем привет, у меня есть код из проекта с открытым исходным кодом, который я интегрирую в свой код. теперь мои настройки кода в наборе символов Visual Studio 2008 — Unicode. а внешний код представляет собой набор многобайтовых символов. когда я меняю настройку символов в своем приложении после добавления нового исходного кода, я получаю другие ошибки в своем коде.
итак, читая из сети, я предполагаю, что мне нужно внести некоторые изменения во внешний код для поддержки unicode. вот мой код :
string FullPathToExe = c:\foo\boo.exe;
vector<char> str2(FullPathToExe.begin(), FullPathToExe.end());
str2.push_back('');
if (!CreateProcess(NULL,
amp;str2[0],
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
amp;si,
amp;pi))
and the error is :
: error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'char *__w64 '
to 'LPWSTR'
я не программист win32, и это для меня ново.
как я могу поддержать обоих разработчиков, которые используют многобайтовый код и Юникод?
Спасибо за помощь
Комментарии:
1. Откуда берется pszAPI? Удаляем это из вопроса, чтобы вы могли опубликовать его как новый вопрос.
Ответ №1:
Вам нужно использовать std::wstring
и vector<wchar_t>
и добавлять в свои строки и символы префикс L.
Ответ №2:
Для первого используйте vector<wchar_t>
вместо vector<char>
.
Для второго используйте L"ERROR: API = %s.n error code = %d.n message = %s.n"
вместо "ERROR: API = %s.n error code = %d.n message = %s.n"
(обратите L
внимание на в начале.
Комментарии:
1. первая проблема была исправлена, но вторая по-прежнему выдает ошибку: ошибка C2664: ‘wsprintfW’: не удается преобразовать параметр 1 из ‘CHAR [512]’ в ‘LPWSTR’ , это символ szPrintBuffer[512]; это проблема
2. Тогда используйте
wchar_t szPrintBuffer[512]
вместо этого.
Ответ №3:
Сделайте это вместо:
wstring FullPathToExe = "c:\foo\boo.exe";
if (!CreateProcess(NULL,
FullPathToExe.c_str(),
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
amp;si,
amp;pi))
Комментарии:
1. @Dani, это, если
FullPathToExe
этоwstring
.
Ответ №4:
a) вы можете отменить определение макроса UNICODE в настройках вашего проекта
б) Вы можете использовать вызванные вами функции в формате ascii, заменить wsprintf на sprintf и CreateProcess на CreateProcessA