win32 CreateProcess не удается преобразовать параметр 2 из ‘char *__w64’ в ‘LPWSTR’ ошибка

#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