Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在应用程序公用数据目录中创建目录 我在Visual C++中有Win32 API应用程序。我想在应用程序公共数据目录中创建一个目录。我有生成以下错误的代码。我还尝试在字符串末尾添加“\0”,但出现了相同的错误_Api_Visual C++_Winapi - Fatal编程技术网

在应用程序公用数据目录中创建目录 我在Visual C++中有Win32 API应用程序。我想在应用程序公共数据目录中创建一个目录。我有生成以下错误的代码。我还尝试在字符串末尾添加“\0”,但出现了相同的错误

在应用程序公用数据目录中创建目录 我在Visual C++中有Win32 API应用程序。我想在应用程序公共数据目录中创建一个目录。我有生成以下错误的代码。我还尝试在字符串末尾添加“\0”,但出现了相同的错误,api,visual-c++,winapi,Api,Visual C++,Winapi,调试断言失败! 表达式:(L“字符串不以NULL结尾”&&0) 代码: TCHAR AppDir[最大路径]; TCHAR设置路径[最大路径] 项目列表*pidl; HRESULT hRes=SHGetSpecialFolderLocation(NULL、CSIDL_COMMON_APPDATA、CSIDL_FLAG_CREATE和pidl); 如果(hRes==NOERROR) { SHGetPathFromIDList(pidl、AppDir); } strcpy_s(SetPath,Ap

调试断言失败! 表达式:(L“字符串不以NULL结尾”&&0)

代码:

TCHAR AppDir[最大路径]; TCHAR设置路径[最大路径]

项目列表*pidl; HRESULT hRes=SHGetSpecialFolderLocation(NULL、CSIDL_COMMON_APPDATA、CSIDL_FLAG_CREATE和pidl); 如果(hRes==NOERROR) { SHGetPathFromIDList(pidl、AppDir); }

strcpy_s(SetPath,AppDir)

::strcat_s(设置路径,“\Keylogger”); ::SHCreateDirectoryExW(hWnd,(LPCWSTR)SetPath,NULL)

::strcat_s(SetPath,“\SnapShot”);
::SHCreateDirectoryExW(hWnd,(LPCWSTR)SetPath,NULL)

您似乎混合了单字节和unicode字符串函数

strcpy_s
strcat_s
用于单字节字符串

SHCreateDirectoryExW
用于unicode宽字符串

尝试使用SHCreateDirectoryEx。

您的大问题是对SHCreateDirectoryExW的调用中的(LPCWSTR)强制转换-这些强制转换显式阻止编译器告诉您错误是什么

<> P>一个一般的规则,我希望更多的C++程序员理解,不要键入。除非你明白为什么。永远不要通过类型转换来“修复”编译器错误:-99%的时间你没有修复错误,你只是隐藏了它

从一开始就分析代码: TCHAR的使用意味着您正在编写可以以UNICODE(文本存储在16位WCHAR字段中)或ANSI构建(其中文本存储在8位字符字段中)为目标的代码。但是,
strxxx_s
函数中的str前缀表示您使用的字符串函数只处理8位字符串。然而,Shell函数上的W是windowsapi宣传函数所期望的UNICODE字符串的方式

要“更正”您的程序,您需要根据编译器设置选择(a)目标ANSI,(b)目标UNICODE,或(c)目标并适当重写。“两者”选项将写为:

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);

我们已经放弃了(错误的)打字。将strxxx的功能替换为TCXXX的版本。和
\u T()
宏中的包装字符串文字,确保它们在定义
\u UNICODE
时为宽字符串,否则为普通ansi字符串。

Yeh!你说得对,非常感谢。感谢您及时准确的评论。谢谢您宝贵的评论。