2015-06-17 2 views
2

Я столкнулся с ошибкой компиляции в Visual Studio 2015, я пытаюсь преобразовать данные char в LPWSTR. Могу я? Или он работает только со строками?Невозможно преобразовать 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&l=EN-US&k=k%28C2664%29&rd=true

  2. C++ cannot convert from enum to LPCTSTR

  3. How to Convert char* to LPWSTR in 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 (вероятно, визуальный проект студии), но код для Windows API, ANSI.

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

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

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

+0

Ваш ответ лучше, чем мой здесь. Мне было интересно, достаточно ли инициализировать строку нулем, как в 'fichier (256, 0);' или это должно быть 'L '\ 0''? –

+0

он уточняет мою проблему! – VAV

+0

@BarmakShemirani: '0' и' L '\ 0'' имеют такой же эффект здесь, это просто нулевое значение, которое неявно преобразуется в 'wchar_t'. Литерал символов просто для ясности. Но я часто использую, например, 'L '#' ', чтобы более легко обнаруживать ошибки« один за другим », которые могут оставить один или несколько символов' # 'в результате. Мне еще предстоит обнаружить его, работая примерно на 20 лет с этой схемой. Но я не сдаюсь! :) –

1

Вы компилируете с юникода, так что вы должны использовать 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"); 
1

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

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

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

+0

Это моя проблема, я сейчас. – VAV

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