如何使用<windows.h> C ++获取当前目录名称

时间:2017-04-10 14:02:46

标签: c++ windows winapi directory

我正在尝试使用win32 api(使用GetCurrentDirectory)作为char数组获取当前目录... 但以下代码打印:004FF56C

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

此代码有什么问题?

1 个答案:

答案 0 :(得分:4)

问题是默认情况下,Visual Studio项目将UNICODE用于所有Win32 API函数。这意味着TCHAR映射到wchar_t而不是char,因此所有基于TCHAR的字符串都被视为wchar_t[]而不是char[]。< / p>

  1. 一个解决方案是使用std::wcout输出Unicode字符串。

  2. 您可以将项目设置更改为默认情况下不使用Unicode,方法是转到Project Properties - &gt; General - &gt; Character set并将其更改为未设置。这告诉编译器将TCHAR映射到char而不是wchar_t

  3. 您可以使用WideCharToMultiByte()std::wcstombs()将Unicode字符串从wchar_t[]转换为char[]

  4. 您可以直接致电GetCurrentDirectoryA()

    char NPath[MAX_PATH];
    GetCurrentDirectoryA(MAX_PATH, NPath);
    std::cout << NPath << endl;
    
  5. 现在回到为什么你得到004FF56C或其他随机数,如果你看一下docs你看到这个运算符,它与std::cout的实现有关:

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

    CharT charstd::coutwchar_tstd::wcout。如果您使用不匹配的char/wchar_tcout/wcout,则会调用another operator(打印指针值的那个),而不是打印文本的那个:

    basic_ostream& operator<<( const void* value );