By Michael Dunn
From www.codeproject.com
/**********原创翻译,转载请注明出处*********** 新手水平有限,欢迎批评指教 By FreeKid /
COM入门简介 -- 什么是COM , 怎样使用它 (4)
特别留意 - 串的处理
我需要先停下来一下,说说关于怎样在COM中处理字符串(String)。如果你对Unicode和ANS字符串的工作原理很清楚,并且知道二者之间应该怎样转化,那么你可以跳过这一部分。
无论何时COM方法返回一个字符串,它一定是Unicode格式的。Unicode是一种字符编码规范,就像ASCII码一样。Unicode中每个字符都占用2个字节。如果你想让它更容易管理,最好把Unicode转化为一个TCHAR类型的字符串。
TCHAR和前缀为 _t 的 函数(如 _tcscpy()等)被设计为无论对于ASCII或是Unicode,都能很好的工作。在大多数情况下,你会用标准的字符串(ANSI String)或是标准(ANSI)的Windows API。因此在本文剩下的部分中,为了简洁起见,我会以 chars 代替 TCHARs。当然,你应该熟练的掌握TCHAR类型,当在别的代码中遇到它们的时候不应该感到陌生。
当你通过COM方法得到一个Unicode字符串的时候,你可以用如下方法把它转化为char:
1. 调用WideCharToMultiByte() API
2. 调用CRT函数wcstombs()
3. 使用CString类的构造函数或者赋值操作符(仅限于MFC)
4. 使用ATL的字符串转换宏
(译者:作者之后介绍了这四种方法具体的函数及其参数规格,此处翻译略,读者可以参考原文或MSDN)
坚持使用Unicode
另一方面,你也可以继续使用Unicode字符串而不必对它做任何复杂的转换。如果你正在写一个控制台应用程序,你可以用std::wcout将Unicode字符串输出,例如:

但是注意wcout仅仅用于Unicode类型的字符串,如果你有任何其它的字符串,仍旧应该使用标准的std::cout 。如果你有一些字符串,可以在它们前面加上 L 前缀使其成为Unicode格式,例如:

如果你一直使用Unicode字符串,请注意以下规则:
对于Unicode,你必须使用类似wcsXXX()的字符串函数,如wcslen();
大部分情况下,你不能在Windows 9x上将Unicode字符串传给Windows API。如果想保持代码在9x和NT上的一致性,最好参照MSDN使用TCHAR类型。
汇总 - 示例代码
下面的两个例子将涵盖说明本文中所有的COM相关概念。代码同样包含在文章的示例工程中。
使用只有一个接口的COM对象
第一个例子展示了怎样使用单接口的COM对象。这是你可能遇到的最简单的例子。为了返回当前桌面壁纸的文件名,代码使用了在shell中包含的活动桌面COClass。为了使代码能够运行,你需要已经安装了活动桌面(Active Desktop)。
步骤包括:
1. 初始化COM库。
2. 创建一个COM对象用来与活动桌面进行交互,并且获得一个IActiveDesktop接口。
3. 调用COM对象的GetWallpaper()方法。
4. 如果GetWallpaper()成功返回,则输出桌面壁纸的文件名。
5. 释放接口。
6. 反初始化COM库。


















































在这个例子中,我使用了std::wcout来显示Unicode字符串wszWallpaper。
(未完待续)