国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

COM編程入門2

2019-11-17 05:45:21
字體:
供稿:網(wǎng)友

  wcstombs()
    這個CRT函數(shù)wcstombs()是個簡化版,但它終結(jié)了WideCharToMultiByte()的調(diào)用,所以最終結(jié)果是一樣的。其原型如下:
size_t wcstombs (
    char*          mbstr,
    const wchar_t* wcstr,
    size_t         count );

以下是參數(shù)解釋:
mbstr
接受結(jié)果ANSI串的字符(char)緩沖。
wcstr
要轉(zhuǎn)換的Unicode串。
count
mbstr參數(shù)所指的緩沖大小。

wcstombs()在它對WideCharToMultiByte()的調(diào)用中使用WC_COMPOS99vECHECK WC_SEPCHARS標志。用wcstombs()轉(zhuǎn)換前面例子中的Unicode串,結(jié)果一樣:

wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );
CString
     MFC中的CString包含有構(gòu)造函數(shù)和接受Unicode串的賦值操作,所以你可以用CString來實現(xiàn)轉(zhuǎn)換。例如:

// 假設(shè)有一個Unicode串wszSomeString...

CString str1 ( wszSomeString ); // 用構(gòu)造器轉(zhuǎn)換
CString str2;

str2 = wszSomeString; // 用賦值操作轉(zhuǎn)換

ATL宏
       ATL有一組很方便的宏用于串的轉(zhuǎn)換。W2A()用于將Unicode串轉(zhuǎn)換為ANSI串(記憶方法是“wide to ANSI”——寬字符到ANSI)。實際上使用OLE2A()更精確,“OLE”表示的意思是COM串或者OLE串。下面是使用這些宏的例子:

#include <atlconv.h>

// 還是假設(shè)有一個Unicode串wszSomeString...

{
char szANSIString [MAX_PATH];
USES_CONVERSION; // 聲明這個宏要使用的局部變量

lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}

OLE2A()宏“返回”轉(zhuǎn)換的串的指針,但轉(zhuǎn)換的串被存儲在某個臨時棧變量中,所以要用lstrcpy()來獲得自己的拷貝。其它的幾個宏是W2T()(Unicode 到 TCHAR)以及W2CT()(Unicode到常量TCHAR串)。
有個宏是OLE2CA()(Unicode到常量char串),可以被用到上面的例子中,OLE2CA()實際上是個更正宏,因為lstrcpy()的第二個參數(shù)是一個常量char*,關(guān)于這個問題本文將在以后作具體討論。
另一方面,假如你不想做以上復(fù)雜的串處理,盡管讓它還保持為Unicode串,假如編寫的是控制臺應(yīng)用程序,輸出/顯示Unicode串時應(yīng)該用全程變量std::wcout,如:

wcout << wszSomeString;

但是要記住,std::wcout只認Unicode,所以你要是“正常”串的話,還得用std::cout輸出/顯示。對于Unicode串文字量,要使用前綴L標示,如:

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

假如保持串為Unicode,編程時有兩個限制:

—— 必須使用wcsXXX() Unicode串處理函數(shù),如wcslen()。
—— 在Windows 9x環(huán)境中不能在Windows API中傳遞Unicode串。要想編寫能在9x和NT上都能運行的應(yīng)用,必須使用TCHAR類型,詳情請參考MSDN。

用例子代碼總結(jié)上述內(nèi)容
    下面用兩個例子演示本文所講的COM概念。代碼中還包含了本文的例子工程。
使用單接口COM對象
    第一個例子展示的是單接口COM對象。這可能是你碰到得最簡單的例子。它使用外殼中的活動桌面組件對象類(CLSID_ActiveDesktop)來獲得當(dāng)前桌面墻紙的文件名。請確認系統(tǒng)中安裝了活動桌面(Active Desktop)。

以下是編程步驟:


初始化COM庫。 (Initialize)
創(chuàng)建一個與活動桌面交互的COM對象,并取得IActiveDesktop接口。
調(diào)用COM對象的GetWallpaper()方法。
假如GetWallpaper()成功,則輸出/顯示墻紙文件名。
釋放接口(Release())。
收回COM庫(Uninitialize)。

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

    // 1. 初始化COM庫(讓W(xué)indows加載DLLs)。通常是在程序的InitInstance()中調(diào)用
    // CoInitialize ( NULL )或其它啟動代碼。MFC程序使用AfxOleInit()。

    CoInitialize ( NULL );

    // 2. 使用外殼提供的活動桌面組件對象類創(chuàng)建COM對象。
    // 第四個參數(shù)通知COM需要什么接口(這里是IActiveDesktop).

    hr = CoCreateInstance ( CLSID_ActiveDesktop,
                            NULL,
                            CLSCTX_INPROC_SERVER,
                            IID_IActiveDesktop,
                            (void**) &pIAD );

    if ( SUCCEEDED(hr) )
        {
        // 3. 假如COM對象被創(chuàng)建成功,則調(diào)用這個對象的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()函數(shù)。其中的代碼用外殼的Shell Link組件對象類創(chuàng)建我們在第一個例子中獲得的墻紙文件的快捷方式
以下是編程步驟:

初始化COM 庫。
創(chuàng)建一個用于建立快捷方式的COM 對象并取得IShellLink 接口。
調(diào)用IShellLink 接口的SetPath()方法
調(diào)用對象的QueryInterface()函數(shù)并取得ipersistFile接口。
調(diào)用IPersistFile 接口的Save()方法。
釋放接口
收回COM庫

CString       sWallpaper = wszWallpaper;  // 將墻紙路徑轉(zhuǎn)換為ANSI

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金华市| 忻城县| 栾川县| 兴山县| 曲阳县| 来安县| 安岳县| 茌平县| 越西县| 陆河县| 大安市| 尖扎县| 文成县| 和林格尔县| 余姚市| 东城区| 井陉县| 太白县| 石柱| 兴化市| 安平县| 卓尼县| 玛曲县| 辉南县| 瑞丽市| 太谷县| 云南省| 温泉县| 苏州市| 茌平县| 玉山县| 什邡市| 茶陵县| 柳州市| 基隆市| 翁源县| 高碑店市| 黎川县| 万安县| 嵩明县| 彭水|