Я обнаружил ошибку компиляции в 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");
До публикации моего вопроса я был на:
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&л = EN-US&K = K% 28C2664% 29&е = верно
Я не нашел свой случай 🙁
Вместо вашего текущего кода:
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.
Вы компилируете с 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");
Ваш проект Visual Studio настроен на компиляцию с использованием «Widechars» в качестве кодировки по умолчанию (иначе UNICODE), поэтому все API-интерфейсы Windows принимают wchar_t
массивы вместо char
массивы при обработке строк.
Либо настройте свой проект на использование стандартной кодировки, либо укажите версию ASCII GetCurrentDirectory
используя GetCurrentDirectoryA
вместо.
GetCurrentDirectory
на самом деле это не функция, а макрос препроцессора, который направит вас к GetCurrentDirectoryA
или же GetCurrentDirectoryW
в зависимости от того, что входит в состав вашего компилятора.