SHGetFolderPathW无法使用日语用户名

时间:2015-02-27 16:57:04

标签: c++ visual-studio-2010 unicode

我尝试使用SHGetFolderPathW函数在%APPDATA%中创建一个文件。我猜这个函数在unicode中得到了字符。我正在使用Visual Studio 2010小项目。以下代码适用于win 8的英文版但不适用于日文版(用户名为日文版):

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
#include <Shlobj.h>
#include <tchar.h>    
#include <string>



int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring output = L""; 

    WCHAR* folder = new WCHAR[2048]; 

    SHGetFolderPathW(NULL, CSIDL_APPDATA,
        NULL, SHGFP_TYPE_CURRENT, folder
        );

    std::wstring str1 = folder;
    str1 += L"\\hola.txt";
    std::wcout << str1 << std::endl;

    std::string str(str1.begin(), str1.end());
    std::cout << str << std::endl;

    // Create file in folder
    FILE * file;
    char *path = new char[str.length()+1];
    strcpy(path, str.c_str());
    file = fopen (path, "w");
    fputs ("Hello World",file);
    fclose (file);

    system("PAUSE");
    return 0;
}

代码在英文版中显示出良好的路径,但在日语中,这条路径不对。我想知道我是否有办法在所有语言中使用SHGetFolderPath。我正在谷歌上搜索两天,但找不到解决方案。

1 个答案:

答案 0 :(得分:2)

如果您有一个宽字符串文件路径,请使用fopen的宽字符串版本。这应该有效:

#include <string>
#include <stdio.h>
#include <Shlobj.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR folder[MAX_PATH]; 

    SHGetFolderPathW(NULL, CSIDL_APPDATA,
        NULL, SHGFP_TYPE_CURRENT, folder
        );

    std::wstring str1 = folder;
    str1 += L"\\hola.txt";

    // Create file in folder
    FILE * file;
    file = _wfopen (str1.c_str(), L"w");
    fputs ("Hello World",file);
    fclose (file);
    return 0;
}