Вопрос:

Как получить текущее имя каталога с помощью <windows.h> C ++

c++ windows winapi directory

1049 просмотра

1 ответ

58 Репутация автора

Я пытаюсь получить текущий каталог, используя Win32 API (используя GetCurrentDirectory) в качестве charмассива ... но следующий код печатает: 004FF56C

TCHAR NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
std::cout << NPath << endl;

В чем проблема в этом коде?

Автор: Ruslan Ver Источник Размещён: 10.04.2017 02:02

Ответы (1)


4 плюса

4168 Репутация автора

Решение

Проблема заключается в том, что по умолчанию проекты Visual Studio используют UNICODE для всех функций Win32 API. Это означает, что TCHARотображается wchar_tвместо вместо char, поэтому все TCHARстроки на основе обрабатываются как wchar_t[]вместо char[].

  1. Одним из решений для этого является использование std::wcoutдля вывода строки Unicode.

  2. Вы можете изменить настройки проекта, чтобы не использовать Unicode по умолчанию, перейдя к Project Properties-> General-> Character setи изменив его на Not Set . Это говорит компилятор для отображения TCHARна charи не wchar_t.

  3. Вы можете преобразовать строку Unicode из wchar_t[]к char[], используя WideCharToMultiByte()или std::wcstombs().

  4. Вы можете позвонить GetCurrentDirectoryA()напрямую.

    char NPath[MAX_PATH];
    GetCurrentDirectoryA(MAX_PATH, NPath);
    std::cout << NPath << endl;
    

Теперь вернемся к тому, почему вы получаете 004FF56Cили какое-то другое случайное число, это связано с реализацией, std::coutесли вы посмотрите на документы, которые вы видите этот оператор:

template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, 
                                     const CharT* s );

там CharTесть charдля std::coutи wchar_tдля std::wcout. В случае , если вы используете несовместимый char/wchar_tс cout/wcoutесть другой оператор , который называется (один , который печатает значения указателей), а не один , который печатает текст:

basic_ostream& operator<<( const void* value );
Автор: Raxvan Размещён: 10.04.2017 02:21
Вопросы из категории :
32x32