快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

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,

      IID_IActiveDesktop,
                                (void**) &pIAD );

        if ( SUCCEEDED(hr) )
            {
            // 3. 如果COM对象被创建成功,则调用这个对象的GetWallpaper() 方法。
            hr = pIAD->GetWallpaper ( wszWallpaper, MAX_PATH, 0 );

            if ( SUCCEEDED(hr) )
                {
                // 4. 如果 GetWallpaper() 成功,则输出它返回的文件名字。
                // 注意这里使用wcout 来显示Unicode 串wszWallpaper.  wcout 是
                // Unicode 专用,功能与cout.相同。
                wcout << L"Wallpaper path is:\n    " << wszWallpaper << endl << endl;
                }
            else
                {
                cout << _T("GetWallpaper() failed.") << endl << endl;
                }

            // 5. 释放接口。
            pIAD->Release();
            }
        else
            {
            cout << _T("CoCreateInstance() failed.") << endl << endl;
            }

        // 6. 收回COM库。MFC 程序不用这一步,它自动完成。
    CoUninitialize();

    在这个例子中,输出/显示Unicode 串 wszWallpaper用的是std::wcout。

    使用多接口的COM对象
        第二个例子展示了如何使用一个提供单接口的COM对象QueryInterface()函数。其中的代码用外壳的Shell Link组件对象类创建我们在第一个例子中获得的墙纸文件的快捷方式
    以下是编程步骤:

    初始化COM 库。
    创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。
    调用IShellLink 接口的SetPath()方法
    调用对象的QueryInterface()函数并取得IPersistFile接口。
    调用IPersistFile 接口的Save()方法。
    释放接口
    收回COM库

    CString       sWallpaper = wszWallpaper;  // 将墙纸路径转换为ANSI

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论