当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

COM编程入门2

      wcstombs()
        这个CRT函数wcstombs()是个简化版,但它终结了WideCharToMultiByte()的调用,所以最终结果是一样的。其原型如下:
    size_t wcstombs (
        char*          mbstr,
        const wchar_t* wcstr,
        size_t         count );

    以下是参数解释:
    mbstr
    接受结果ANSI串的字符(char)缓冲。
    wcstr
    要转换的Unicode串。
    count
    mbstr参数所指的缓冲大小。

    wcstombs()在它对WideCharToMultiByte()的调用中使用WC_COMPOS99vECHECK WC_SEPCHARS标志。用wcstombs()转换前面例子中的Unicode串,结果一样:

    wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );
    CString
         MFC中的CString包含有构造函数和接受Unicode串的赋值操作,所以你可以用CString来实现转换。例如:

    // 假设有一个Unicode串wszSomeString...

    CString str1 ( wszSomeString ); // 用构造器转换
    CString str2;

    str2 = wszSomeString; // 用赋值操作转换

    ATL宏
           ATL有一组很方便的宏用于串的转换。W2A()用于将Unicode串转换为ANSI串(记忆方法是“wide to ANSI”——宽字符到ANSI)。实际上使用OLE2A()更精确,“OLE”表示的意思是COM串或者OLE串。下面是使用这些宏的例子:

    #include <atlconv.h>

    // 还是假设有一个Unicode串wszSomeString...

    {
    char szANSIString [MAX_PATH];
    USES_CONVERSION; // 声明这个宏要使用的局部变量

    lstrcpy ( szANSIString, OLE2A(wszSomeString) );
    }

    OLE2A()宏“返回”转换的串的指针,但转换的串被存储在某个临时栈变量中,所以要用lstrcpy()来获得自己的拷贝。其它的几个宏是W2T()(Unicode 到 TCHAR)以及W2CT()(Unicode到常量TCHAR串)。
    有个宏是OLE2CA()(Unicode到常量char串),可以被用到上面的例子中,OLE2CA()实际上是个更正宏,因为lstrcpy()的第二个参数是一个常量char*,关于这个问题本文将在以后作详细讨论。
    另一方面,如果你不想做以上复杂的串处理,尽管让它还保持为Unicode串,如果编写的是控制台应用程序,输出/显示Unicode串时应该用全程变量std::wcout,如:

    wcout << wszSomeString;

    但是要记住,std::wcout只认Unicode,所以你要是“正常”串的话,还得用std::cout输出/显示。对于Unicode串文字量,要使用前缀L标示,如:

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

    如果保持串为Unicode,编程时有两个限制:

    —— 必须使用wcsXXX() Unicode串处理函数,如wcslen()。
    —— 在Windows 9x环境中不能在Windows API中传递Unicode串。要想编写能在9x和NT上都能运行的应用,必须使用TCHAR类型,详情请参考MSDN。

    用例子代码总结上述内容
        下面用两个例子演示本文所讲的COM概念。代码中还包含了本文的例子工程。
    使用单接口COM对象
        第一个例子展示的是单接口COM对象。这可能是你碰到得最简单的例子。它使用外壳中的活动桌面组件对象类(CLSID_ActiveDesktop)来获得当前桌面墙纸的文件名。请确认系统中安装了活动桌面(Active Desktop)。

    以下是编程步骤:

    初始化COM库。 (Initialize)
    创建一个与活动桌面交互的COM对象,并取得IActiveDesktop接口。
    调用COM对象的GetWallpaper()方法。
    如果GetWallpaper()成功,则输出/显示墙纸文件名。
    释放接口(Release())。
    收回COM库(Uninitialize)。

    WCHAR   wszWallpaper [MAX_PATH];
    CString strPath;
    HRESULT hr;
    IActiveDesktop* pIAD;

        // 1. 初始化COM库(让Windows加载DLLs)。通常是在程序的InitInstance()中调用
        // CoInitialize ( NULL )或其它启动代码。MFC程序使用AfxOleInit()。

        CoInitialize ( NULL );

        // 2. 使用外壳提供的活动桌面组件对象类创建COM对象。
        // 第四个参数通知COM需要什么接口(这里是IActiveDesktop).

        hr = CoCreateInstance ( CLSID_ActiveDesktop,
                                NULL,
                                CLSCTX_INPROC_SERVER,

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接