2009-10-07 47 views
0

我在visual C++中有win32 API應用程序。我想在應用程序公共數據目錄中創建一個目錄。我有代碼正在生成以下錯誤。我也嘗試在字符串的末尾添加'\ 0',但同樣的錯誤出現。在應用程序通用數據目錄中創建一個目錄

Debug Assertion Failed! 表達式:(L「字符串不是NULL終止」& & 0);

code:

TCHAR AppDir [MAX_PATH]; TCHAR SetPath [MAX_PATH];

ITEMIDLIST * pidl; HRESULT hRes = SHGetSpecialFolderLocation(NULL,CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE,& pidl); if(hRes == NOERROR) SHGetPathFromIDList(pidl,AppDir); }

strcpy_s(SetPath,AppDir);

:: strcat_s(SetPath,「\ Keylogger」); :: SHCreateDirectoryExW(hWnd,(LPCWSTR)SetPath,NULL);

:: strcat_s(SetPath,「\ SnapShot」); :: SHCreateDirectoryExW(hWnd,(LPCWSTR)SetPath,NULL);

回答

1

您最大的問題是(LPCWSTR)在調用SHCreateDirectoryExW時強制轉換 - 這些轉換明確阻止編譯器告訴您錯誤是什麼。

我希望更多的C++程序員能夠理解的一般規則是,不要強制轉換。除非你明白爲什麼。永遠不要修改'修正'編譯器錯誤: - 99%的時間你沒有修復錯誤,你只是隱藏了它。

從頭開始分析代碼: TCHAR的使用意味着您正在編寫可以定位UNICODE(文本存儲在16位WCHAR字段中)或ANSI構建(其中文本存儲在8位CHAR字段中)的代碼。但strxxx_s函數中的str前綴表示您正在使用僅處理8位字符串的字符串函數。然而,Shell上的W函數是Windows API如何通告函數需要UNICODE字符串。 (a)目標ANSI,(b)目標UNICODE,或(c)取決於編譯器設置,並適當地重寫它們,以便'更正'你的程序。 'both'選項將寫爲:

TCHAR AppDir[MAX_PATH]; 
TCHAR SetPath[MAX_PATH]; 
ITEMIDLIST* pidl; 
HRESULT hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE ,&pidl); 
SHGetPathFromIDList(pidl, AppDir); 
_tcscpy_s(SetPath,AppDir); 
_tcscat_s(SetPath,_T("\Keylogger")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 
_tcscat_s(SetPath,_T("\SnapShot")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 

我們已經放棄了(不正確的)類型轉換。用_tcsxxx_s版本替換strxxx_s函數。並在_T()宏中包裝字符串文字,以確保在定義_UNICODE時它們是寬字符串,否則就是正常的ansi字符串。

+0

感謝您的寶貴意見。 – 2009-10-21 06:56:48

0

看起來你正在混合單字節和單字節字符串函數。

strcpy_sstrcat_s用於單字節字符串

SHCreateDirectoryExW用於Unicode寬字符串。

嘗試使用SHCreateDirectoryEx。

+0

Yeh!你是對的,非常感謝。爲了您的及時和準確的評論。 – 2009-10-07 15:15:44