【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (4)

翻译 2007年10月03日 14:20:00
Introduction to COM - What It Is and How to Use It
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 << wszSomeString;

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

wcout << L"The Oracle says..." << endl << wszOracleResponse;

如果你一直使用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库。

<PRE id=pre13 style="MARGIN-TOP: 0px">WCHAR   wszWallpaper [MAX_PATH];
CString strPath;
HRESULT hr;
IActiveDesktop
* pIAD;

    
// 1. Initialize the COM library (make Windows load the DLLs). Normally you would
    
// call this in your InitInstance() or other startup code.  In MFC apps, use
    
//  AfxOleInit() instead.</FONT>
    CoInitialize ( NULL );

    
<FONT color=#009900>// 2. Create a COM object, using the Active Desktop coclass provided by the shell.
    
// The 4th parameter tells COM what interface we want (IActiveDesktop).</FONT>
    hr = CoCreateInstance ( CLSID_ActiveDesktop,
                            NULL,
                            CLSCTX_INPROC_SERVER,
                            IID_IActiveDesktop,
                            (
void**&pIAD );

    
if ( SUCCEEDED(hr) )
        
...{
        
<FONT color=#009900>// 3. If the COM object was created, call its GetWallpaper() method.</FONT>
        hr = pIAD->GetWallpaper ( wszWallpaper, MAX_PATH, 0 );

        
if ( SUCCEEDED(hr) )
            
...{
            
// 4. If GetWallpaper() succeeded, print the filename it returned.
            
// Note that I'm using wcout to display the Unicode string wszWallpaper.
            
// wcout is the Unicode equivalent of cout.
            wcout << L"Wallpaper path is:     " << wszWallpaper << endl << endl;
            }

        
else
            
...{
            cout 
<< _T("GetWallpaper() failed."<< endl << endl;
            }


        
// 5. Release the interface.
        pIAD->Release();
        }

    
else
        
...{
        cout 
<< _T("CoCreateInstance() failed."<< endl << endl;
        }


    
// 6. Uninit the COM library.  In MFC apps, this is not necessary since MFC does
    
// it for us.
    CoUninitialize();</PRE>

在这个例子中,我使用了std::wcout来显示Unicode字符串wszWallpaper。

(未完待续)

相关文章推荐

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建http://www.aboutyun.com/thread-9341-1-1.html

文章转自:http://www.aboutyun.com/thread-9341-1-1.html 问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许...

【原创】使用vc向导简历的ATL COM简单对象好像没有IUnknown接口的实现?

  这两天看了看COM和ATL,还是有点云里雾里的感觉。对ATL如何实现COM的一个可创建对象还是不太明白,只知道一些概念。知识仅局限于能够使用VC 的向导简历一个ATL工程,增加一个ATL简单对象,...
  • ppslide
  • ppslide
  • 2011年06月17日 13:27
  • 590

HTML5之SVG详解(一) 时间 2012-12-21 19:49:00 博客园-原创精华区 原文 http://www.cnblogs.com/hupeng/archive/2012/12/2

1、背景 SVG是Scalable Vector Graphics的缩写,意为可缩放矢量图形。1998年,万维网联盟成立了一个工作组,研发一种通过XML来表现矢量图形的技术——SVG!由于SVG...

默写js日历控件和详细注释(非原创 原作者:@author KimSoft (jinqinghua [at] gmail.com)

一直对日历控件很感兴趣,感觉很深奥的东西,最近也在努力学习js,看了几本js的经典入门书籍,看完就忘了,就想着看了看 其他大牛写得日历控件,看完了自己尝试着按照他们的思路写了一个,基本算是默背下来的...
  • longvs
  • longvs
  • 2013年09月08日 23:49
  • 1085

COM入门简介

COM简单来说在不同应用和语言之间提供了一种二进制代码级分享途径的方法。这和C++重用代码有很大不同,C++只是提供了一种源代码级的 代码重用(ATL就是一个很好的例子)它的调用者只能使用C++语言,...

Python NLTK学习6(创建词性标注器)除特别注明外,本站所有文章均为刘杰的个人网站原创 转载请注明出处: http://www.burnelltek.com/blog/60740e24d2f

除特别注明外,本站所有文章均为刘杰的个人网站原创 转载请注明出处: http://www.burnelltek.com/blog/60740e24d2f711e6841d00163e0c0e36...
  • AMDS123
  • AMDS123
  • 2017年03月28日 20:40
  • 5998

iOS-NSRegularExpression(原创http://zhuhaibobb.blog.163.com/blog/static/27440067201411752450958/)

最近遇到一个需要进行字符串匹配的问题,我就想到用正则表达式来解决,通过ios中的NSRegularExpression这个类就可以帮助我们实现这个。 问题陈述: 现在我要对一个语句进行...

李望 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-10000290

一次汇编分析的经历关键词(为了搜索引擎优化,为了点击量)寄存器、ia32、AT&T汇编、intel汇编、x86架构、x64架构背景为了想知道为什么i++ ++i不是原子操作测试方法编写两个程序,调用o...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (4)
举报原因:
原因补充:

(最多只允许输入30个字)