none
为什么在windows8.1中,CP_ACP和CP_THREAD_ACP不一致。 RRS feed

  • 问题

  • 同一个程序,在win7中文版CP_ACP和CP_THREAD_ACP都是gbk。而win8.1英文版,只有CP_ACP是gbk。win8.1语言已经设置成中文的,并且2个系统的非unicode编码已经设置成中文。

    1. 使用的是类似GetACPInfoEx(CP_THREAD_ACP,...)来获取的编码名字。
    2. 程序是多线程程序但都是在主线程调用的GetACPInfoEx。
    3. 没有在任何地方调用过SetThreadLocale。
    4. GetACPInfoEx在程序差不多刚开始的时候调用的(OnInitDialog),所以大概没可能被其他的api改了threadacp。

    最后,为什么ATL(CW2A, CA2W, ...)默认用CP_THREAD_ACP,而其他windows api(CreateWindowA之类)都用得是CP_ACP。

    2014年9月2日 1:44

全部回复

  • 你好,

    你检查一下你每个线程有没有什么地方设置了locale,同时梳理一下你的线程调用关系包括一些dll 的调用,有可能在某一个环节或地方修改了线程acp。这里给你看一个案例:

    http://www.cnblogs.com/navono007/p/3422110.html

    从ATL源码中,我们可以发现有这么一段代码(如下),你可以尝试在你的ATL代码中定义_CONVERSION_DONT_USE_THREAD_LOCALE 去试试。

    namespace ATL
    {
    
    inline UINT WINAPI _AtlGetConversionACP() throw()
    {
    #ifdef _CONVERSION_DONT_USE_THREAD_LOCALE
    	return CP_ACP;
    #else
    	return CP_THREAD_ACP;
    #endif
    }

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月2日 7:57
  • 你说的我都知道。包括你发的链接我也搜索到过。我的程序在很多机器都正常的(xp或win7中文版),唯独到了win8.1英文版就不正常了。所以,到底是8.1有什么不同呢,还是英文版有什么不同呢?

    顺便还想知道为什么ATL是这么选择的?在写程序的时候CP_ACP和CP_THREAD_ACP应该如何选择?

    2014年9月2日 11:55