【问题标题】:Creating a directory in Application Common Data Directory在应用程序公共数据目录中创建目录
【发布时间】:2009-10-07 14:34:59
【问题描述】:

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

调试断言失败! 表达式:(L“String is not NULL terminate” && 0);

代码:

TCHAR AppDir[MAX_PATH]; TCHAR 设置路径[MAX_PATH];

ITEMIDLIST* pidl; HRESULT hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE,&pidl); 如果 (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);

【问题讨论】:

    标签: api visual-c++ winapi


    【解决方案1】:

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

    我希望更多 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);
    

    我们删除了(不正确的)类型转换。将 strxxx_s 函数替换为 _tcsxxx_s 版本。并将字符串文字包装在 _T() 宏中,以确保在定义 _UNICODE 时它们是宽字符串,否则为普通 ansi 字符串。

    【讨论】:

    • 感谢您的宝贵意见。
    【解决方案2】:

    您似乎在混合使用单字节和 unicode 字符串函数。

    strcpy_sstrcat_s 用于单字节字符串

    SHCreateDirectoryExW 用于 unicode 宽字符串。

    尝试使用 SHCreateDirectoryEx。

    【讨论】:

    • 耶!你是对的,非常感谢。为了您及时准确的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2012-03-09
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多