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

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。

(未完待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值