2014-02-28 99 views
-1

我正在處理VS 2010中的C++項目。我想要獲取DESKTOP的路徑,我已經編寫了一些教程中給出的以下代碼。獲取C++中的系統文件夾

TCHAR path[MAX_PATH]; 
SHGetSpecialFolderPath(0,path,CSIDL_DESKTOP,FALSE); 
printf("Path : %s",path); 

但上面的代碼只是印刷

路徑:C

麻煩改正在上面的代碼

回答

3

使用_tprintf

http://msdn.microsoft.com/en-us/library/wc7014hz.aspx

當一個TCHAR字符串被傳遞給一個窄字符串函數(如printf)時,數據將被逐字節讀取,並且當它到達第一個空字符('\ 0')時,它將是解釋爲字符串的結尾。這就是爲什麼它只打印TCHAR字符串的第一個字符。

_tprintf一次只能看到一個TCHAR,所以它會一直看,直到它遇到一個零的TCHAR。

+0

這解釋了爲什麼它只輸出'C' - 路徑是一個寬字符,第二個字節是0;從而儘早終止字符串。 – seand

2

我認爲你的項目在設置中有一個字符集'Unicode'。 在這種情況下,TCHAR被視爲wchar_t,而SHGetSpecialFolderPath被定義爲SHGetSpecialFolderPathW,因此,您獲得的'DESKTOP'路徑是Unicode編碼,因此您有兩個選擇來解決此問題。

  1. 1.用'printf('%S')''大寫字母'S'而不是小寫字母's'來打印您的路徑。
  2. 2.用'wprintf('%s「)'小寫's'除大寫字母'S'來打印您的路徑。

也就是說,您可以用相反的'S'或's'打印相反的char(char/wchar_t)。 我很高興可能是我可以幫你! 哦,我忘了解釋輸出。 在你的代碼中,path是wchar_t,但'%s'是小寫's',你的路徑被'printf'當作char來對待。

的wchar_t的數據(16位)在你的路徑是這樣的:

{L'C 'L '\',L'W',L'I 'L'N',L'd ',L''',L''',L's',L''',.../ /}

而char數據(也稱爲字節數據,8位)是這樣的: {'C','\ 0','\','\ 0','W','\ 0','i','\ 0',.../ /}

它看起來像s因爲「\ Windows .../** /」位於'null-terminal'標記'\ 0'後面,因此被忽略。