惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
B
Blog
博客园_首页
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog RSS Feed
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
量子位
V
V2EX
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
I
InfoQ
博客园 - 【当耐特】

博客园 - vibration

ATL3.0组件注册bug的解决方法 奇怪的引用错误及解决方法 标题栏按钮的WTL实现 AppBar的WTL实现 招聘C++和C#开发工程师 ATL组件中文路径注册问题(转载) 关于C++模板的连接问题 - vibration - 博客园 用窗口消息解决COM接口的多线程访问问题 用全局接口表实现COM接口在不同线程中的传递 MyMSN支持自定义内容了 自画菜单的WM_MEASUREITEM只会发送一次 悼念皮皮 上了点照片 一个测试记忆力的小游戏 老板该如何向核心员工许诺 ActiveScript SkinX界面换肤框架更新 反射获取定制Attribute Skin技术实现框架(完)
OLE2T在VS2003中转换中文失败的问题及解决方法
vibration · 2005-11-04 · via 博客园 - vibration

以前VC6的代码,从xml文件中读取属性文字(中文),返回BSTR类型,用OLE2T转换,然后显示,一直工作很正常,用来做本地化,比修改Res文件要方便的多。

同样的代码,在VS2003里面居然不能工作了,调试,发现BSTR返回正常,而通过OLE2T转换居然就全转成“???”了,晕。

做了无数尝试,发现用unicode编译就正常。可是原来的VC6项目不论是否Unicode编译都正常的,要把一个项目全部转成Unicode还是有相当工作量的,似乎也并没有必要。

寻找解决方法,看了一堆ATL的代码,ATL7提供了OLE2T的代替品COLE2T,用一个重载是COLE2T(bstr, codepage),发现给把第二个参数设置成CP_ACP,即ANSI code page就转换正常了。原来是codepage的问题,ATL搞了一大堆代码来获取转换用的codepage,看得人晕,而我要的只是ANSI code page。

继续找,终于找到了,ATL的代码通过一条宏定义进行了分支。如果定义了宏_CONVERSION_DONT_USE_THREAD_LOCALE,则对当前code page的请求简单返回CP_ACP,否则,就搞了一大堆代码从当前线程中查询。那么我们要做的就是定义这个宏就可以了。试了一下,果然如此

最终解决方案,在stdafx.h的所有包含文件前面加上:
#define _CONVERSION_DONT_USE_THREAD_LOCALE

搞定