一、为测试其他语言的WINDOWS,我在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”;二、已经使工程为unicode模式,而且界面中的汉字都能以unicode正常显示:
#define UNICODE
#define _UNICODE
#pragma comment(linker, "/entry:\"wWinMainCRTStartup\"")三、下面的代码的执行结果中,汉字为什么变成了问号?
SHFILEINFOA sfi;
SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
//此时sfi.szTypeName的内容本应为“ACDSee GIF 图像”,但为什么显示为“ACDSee GIF ??”;附加说明:
尝试1:如果把SHFILEINFOA和SHGetFileInfoA都改为相应的unicode版本,则结果汉字正常;
尝试2:如果把“区域和语言选项”中的系统默认语言改为“中文(中国)”,则汉字也会正常。请问,在“英语(美国)环境下,unicode工程中”,这个ANSI版本的函数怎样才能正确得到结果?谢谢!

解决方案 »

  1.   

    在之前调用这个试下
    #include <locale.h>
    setlocale(LC_CTYPE, "chs");
      

  2.   

    谢谢你的回答,感觉你的回答非常有道理,不过试了还是不行,现象没有改变。
    而且,我还用setlocale(LC_ALL, "chs");setlocale(LC_CTYPE, "zh");setlocale(LC_ALL, "zh");都试了,都不行。
    我的问题可以做简化如下(这个问题和工程是否为unicode没有关系):1、在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”;
    2、工程为ansi工程;
    3、下面代码得到的汉字为问号:
    SHFILEINFO sfi; 
    SHGetFileInfo("test.gif", 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME); 
    //此时sfi.szTypeName的内容本应为“ACDSee GIF 图像”,但为什么显示为“ACDSee GIF ??”; 
      

  3.   

    SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFOA), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME); 
      

  4.   

    前面结构也用 SHFILEINFOA 试试
      

  5.   

    SHFILEINFOA sfi = {0};
    sfi.cbFileInfo = sizeof(SHFILEINFOA); 
    SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFOA), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME); 
      

  6.   

    哦,看错了。。是用的 SHFILEINFOA
      

  7.   

    sorry,  sfi.cbFileInfo = sizeof(SHFILEINFOA);  这行不要
      

  8.   

    谢谢两位,依然不行。
    最新的简易验证代码如下:
    首先,在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”
    #include <windows.h>
    #include <shellapi.h>
    #include <locale.h>int main(int argc, char* argv[])
    {
    setlocale(LC_CTYPE, "chs"); SHFILEINFOA sfi;
    SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFOA), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
    printf("[%s]\n", sfi.szTypeName);
    //期望执行结果为:[ACDSee GIF 图像]
    //实际执行结果为:[ACDSee GIF ??] return 0;
    }
      

  9.   

    在我的电脑里,工程设置unicode,把你的代码执行了是好的,即使不要setlocale(LC_CTYPE, "chs")也是好的
    不知道你的机器那里的设置和我的不同
      

  10.   

    先用UNICODE版本的SHGetFileInfoW获取SHFILEINFOW,然后再通过WideCharToMultiByte转换为相应的Ansi版本。