代码之家  ›  专栏  ›  技术社区  ›  Ravi shankar

在应用程序公用数据目录中创建目录

  •  0
  • Ravi shankar  · 技术社区  · 16 年前

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

    表达式:(LString不是以NULL结尾的&0);

    代码:

    TCHAR AppDir[最大路径];

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

    strcpy_s(SetPath,AppDir);

    ::SHCreateDirectoryExW(hWnd,(LPCWSTR)SetPath,NULL);

    ::strcat_s(SetPath,“\SnapShot”);

    2 回复  |  直到 16 年前
        1
  •  1
  •   Chris Becke    16 年前

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

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

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

    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
  •  0
  •   RED SOFT ADAIR    16 年前

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

    strcpy_s strcat_s

    SHCreateDirectoryExW 用于unicode宽字符串。