2009-10-07 48 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