Невозможно преобразовать CHAR в LPWSTR

Я обнаружил ошибку компиляции в Visual Studio 2015, которую я пытаюсь преобразовать char данные для LPWSTR, Могу я? Или это работает только со строковыми типами?

Вот часть моего кода:

    ⋮
FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
strcat(fichier, "\\fichierlog.txt");

До публикации моего вопроса я был на:

  1. https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&л = EN-US&K = K% 28C2664% 29&е = верно

  2. C ++ не может конвертировать из enum в LPCTSTR

  3. Как конвертировать char * в LPWSTR в VC ++?

Я не нашел свой случай 🙁

2

Решение

Вместо вашего текущего кода:

FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
strcat(fichier, "\\fichierlog.txt");

сделать, например,

auto main() -> int
{
//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

std::wstring fichier( MAX_PATH, L'\0' );//   <--- HERE s my char table
const DWORD len = GetCurrentDirectory( fichier.size(), &fichier[0] );
if( len == 0 || len >= fichier.size() ) { throw std::runtime_error( "GetCurrentDirectory failed." ); }
fichier.resize( len );
fichier += L"/fichierlog.txt";

std::ifstream sortie( fichier );

Это должно исправить три проблемы:

  • Вы компилируете как Unicode (возможно, проект Visual Studio), но код для API Windows ANSI.

  • Вы используете компилятор C ++, но код низкого уровня C.

  • Слишком маленький буфер для максимальной длины пути и возможного переполнения буфера для объединения.

Обратите внимание, что ifstream Конструктор, который принимает широкую строку, является расширением Microsoft. Однако для компиляторов Windows C ++ это будет практически необходимо при добавлении файловой системы в стандартную библиотеку в C ++ 17.

2

Другие решения

Вы компилируете с Unicode, поэтому вы должны использовать wchar_t объявить строки. Вместо strcat используйте версию Unicode, которая wcscat,

Также измените строки «\ fichierlog.txt» стать L«\ Fichierlog.txt»

FILE *sortie;
//char fichier[256];//   <--- HERE s my char table
wchar_t fichier[256];//   <--- HERE s my char table

//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
//strcat(fichier, "\\fichierlog.txt");
wcscat(fichier, L"\\fichierlog.txt");
2

Ваш проект Visual Studio настроен на компиляцию с использованием «Widechars» в качестве кодировки по умолчанию (иначе UNICODE), поэтому все API-интерфейсы Windows принимают wchar_t массивы вместо char массивы при обработке строк.

Либо настройте свой проект на использование стандартной кодировки, либо укажите версию ASCII GetCurrentDirectory используя GetCurrentDirectoryA вместо.

GetCurrentDirectory на самом деле это не функция, а макрос препроцессора, который направит вас к GetCurrentDirectoryA или же GetCurrentDirectoryW в зависимости от того, что входит в состав вашего компилятора.

1
По вопросам рекламы [email protected]