我嘗試使用(使用GetCurrentDirectory
)的Win32 API作爲char
陣列... 獲得當前目錄,但下面的代碼打印件的當前目錄的名稱:004FF56C如何使用<windows.h> C++
TCHAR NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
std::cout << NPath << endl;
什麼這個代碼中的問題是什麼?
我嘗試使用(使用GetCurrentDirectory
)的Win32 API作爲char
陣列... 獲得當前目錄,但下面的代碼打印件的當前目錄的名稱:004FF56C如何使用<windows.h> C++
TCHAR NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
std::cout << NPath << endl;
什麼這個代碼中的問題是什麼?
問題是,默認情況下,Visual Studio項目對所有Win32 API函數都使用UNICODE。這意味着TCHAR
映射到wchar_t
而不是char
,因此所有基於TCHAR
的字符串都被視爲wchar_t[]
而不是char[]
。
對此的一個解決方案是使用std::wcout
來輸出Unicode字符串。
您可以更改項目設置,默認情況下不使用Unicode,前往Project Properties
- >General
- >Character set
,並更改到不設置。這告訴編譯器將TCHAR
映射到char
而不是wchar_t
。
您可以使用WideCharToMultiByte()
或std::wcstombs()
將Unicode字符串從wchar_t[]
轉換爲char[]
。您可以直接致電GetCurrentDirectoryA()
。
char NPath[MAX_PATH];
GetCurrentDirectoryA(MAX_PATH, NPath);
std::cout << NPath << endl;
現在回到爲什麼YOUT得到004FF56C
或其他一些隨機數,它有,如果你看看與std::cout
實施做docs你看這個操作符:
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
有another operator被稱爲(一個打印指針值),而不是打印文本的一個:
basic_ostream& operator<<(const void* value);
我懷疑你已經定義了'UNICODE'宏。嘗試使用'std :: wcout'代替。 –
哇,謝謝! 但如果我想仍然使用常規的std :: cout我該怎麼辦? –
@Ruslan Ver你需要在visual studio中更改設置以不使用UNICODE,轉到項目屬性和第一頁,將'Use Unicode Character Set'更改爲'Not Set' – Raxvan