【原创翻译】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。

(未完待续)

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

Introduction to COM - What It Is and How to Use It By Michael Dunn From www.codeproject.com/********...
  • FreeKid
  • FreeKid
  • 2007年10月05日 15:58
  • 961

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

Introduction to COM - What It Is and How to Use It By Michael Dunn From www.codeproject.com/********...
  • FreeKid
  • FreeKid
  • 2007年09月30日 21:59
  • 1192

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

Introduction to COM - What It Is and How to Use It By Michael Dunn From www.codeproject.com/********...
  • FreeKid
  • FreeKid
  • 2007年10月01日 17:05
  • 1131

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

Introduction to COM - What It Is and How to Use It By Michael Dunn From www.codeproject.com/********...
  • FreeKid
  • FreeKid
  • 2007年10月02日 13:39
  • 951

COM组件入门(一)

最近需要用到COM组件的知识,看了看COM编程指南,感觉还不错,把我的学习心得记录下来。这是我写...
  • davidsu33
  • davidsu33
  • 2014年08月13日 17:08
  • 1270

什么是闭包,如何使用它,为什么要使用它?

还是上面的题目,做个变形。 var x = 0; var foo = { x:1, bar:function () { console.log(this.x)...
  • mrhaoxiaojun
  • mrhaoxiaojun
  • 2018年01月10日 17:46
  • 67

什么是COM组件?

什么是COM组件? Answer: COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 COM组件是遵循COM规范编写的 COM组件是一些小的二进制可执行文件...
  • eccode
  • eccode
  • 2007年01月08日 23:30
  • 1766

COM编程入门(第一部分 什么是COM,如何使用COM)

COM编程入门 第一部分 ...
  • jiangxinyu
  • jiangxinyu
  • 2006年11月14日 14:31
  • 1504

Com编程入门——什么是COM,如何使用COM

本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。本文不包括如何编写自己的COM对象和接口。  ...
  • mao0514
  • mao0514
  • 2013年09月30日 08:17
  • 1403

COM入门第一部分 - 什么是COM和如何使用COM

(本文于2007年11月5日进行过编辑,修正若干用词不当的问题)COM入门第一部分 - 什么是COM和如何使用COM作者:Michael Dunn译者:蒋国纲 本文目的 此文为刚开始学习COM并需要一...
  • guogangj
  • guogangj
  • 2006年10月30日 20:39
  • 7964
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (4)
举报原因:
原因补充:

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