日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

com接口传入、传出字符串的说明和例程

發(fā)布時(shí)間:2025/3/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 com接口传入、传出字符串的说明和例程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
com接口傳入、傳出字符串的說明和例程 http://www.cnblogs.com/henryzc/archive/2005/11/11/273910.html

com接口傳入的參數(shù)除了基本的非指針類型(如ing ,long ,bool等),其余的都要使用com特定的類型 --
???對(duì)于字符串,應(yīng)該使用BSTR類型,這種類型是一種模糊類型,微軟并沒有公開內(nèi)部結(jié)構(gòu),所有必須使用支持的API去操縱它
???其他的還有VARIANT, SAFEARRAY等類型,可以參考資料( ATL或者 VC開發(fā)COM組件方面的資料),此處不多說了


給你一段代碼吧,將傳入的字符串變成大寫返回

接口定義為
??????? [id(1), helpstring("method Upper")] HRESULT Upper([in] BSTR inStr,[out ,retval] BSTR *outStr);

實(shí)現(xiàn)代碼為

STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr)
{
/*
?
?????? 相關(guān)類型轉(zhuǎn)換:
????????? 從BSTR字符串轉(zhuǎn)換到Unicode字符串(例如LPOLESTR)不是必須的,即不需要轉(zhuǎn)換,可以當(dāng)作一個(gè)Unicode字符串使用
????????? 從Unicode字符串轉(zhuǎn)換到BSTR字符串必須經(jīng)過相應(yīng)的API函數(shù) SysAllocString。

????????? 從標(biāo)準(zhǔn)C的字符串轉(zhuǎn)換到Unicode字符串需要使用MultiByteToWideChar函數(shù)。
????????? 從Unicode字符串轉(zhuǎn)換到標(biāo)準(zhǔn)C的字符串需要使用WideCharToMultiByte函數(shù)。

????????? 總結(jié):由此可見,使用Unicode字符串當(dāng)作中介,則可以在標(biāo)準(zhǔn)C的字符串和BSTR字符串之間相互轉(zhuǎn)換!

????????? 函數(shù)流程:
???????????? 將傳入的字符串 inStr通過轉(zhuǎn)換函數(shù)轉(zhuǎn)換成相應(yīng)的標(biāo)準(zhǔn)C字符串 szInStr,通過標(biāo)準(zhǔn)C的大寫轉(zhuǎn)換函數(shù)將szInStr轉(zhuǎn)換成大寫。
???????????? 將szInStr通過轉(zhuǎn)換函數(shù)轉(zhuǎn)換成BSTR字符串 outStr,作為返回值輸出

???
????????? 補(bǔ)?充:
????????????? 從C標(biāo)準(zhǔn)字符串轉(zhuǎn)換到BSTR字符串,如果在ATL中使用類 CComBSTR,則轉(zhuǎn)換可以相當(dāng)簡化,只需要一行代碼
????????????? //Convert from char * to BSTR
????????????? //CComBSTR?bstrString(szStdString);
????????????? //Done!!
*/


???????? //以下是不使用 ATL 中的 類,直接使用 API 的方法
???????? //

??????? //得到字符串的長度
??????? //
??????? long?nLen?=?WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
??????? char * szInStr = new char[nLen];

??????? //從 Unicode字符串 轉(zhuǎn)換成 C標(biāo)準(zhǔn)字符串
??????? //
??????? WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
??????? szInStr?=?strupr(szInStr);

???????? //處理多字符集的最安全的函數(shù)是 lstrlen(而不是strlen)
???????? //
???????? nLen?=?lstrlen(szInStr) +?1;??????? //加 1 的原因是要加上2個(gè)結(jié)尾為NULL的字符(下一步將乘2使之加倍)
????????? int?nAlloc?=?2?*?nLen;

????????? //分配空間給 Unicode字符串
????????? //
????????? LPOLESTR szNewOleString;
????????? szNewOleString?=?(OLECHAR *)new wchar_t[nAlloc];

????????? //轉(zhuǎn)換 C標(biāo)準(zhǔn)字符串到 Unicode 字符串
????????? //
????????? MultiByteToWideChar(CP_ACP , 0, szInStr, -1,zNewOleString,nLen);?? //注意這里是nLen,而不是nAlloc!!

?????????? //從 Unicode字符串 轉(zhuǎn)換到 BSTR字符串
?????????? BSTR?bstrTemp;
?????????? bstrTemp?=?SysAllocString( szNewOleString);
?????????? *outStr??=?bstrTemp;

?????????? return S_OK;
}


//以下為按照補(bǔ)充中說明的使用 CComBSTR類 方法的代碼:
???????? //
???????? long?nLen?=?WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
???????? char * szInStr = new char[nLen];
???????? WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
???????? szInStr?=?strupr(szInStr);

???????? MessageBox(NULL,szInStr,"",MB_OK);

???????? //從 C標(biāo)準(zhǔn)字符串 直接轉(zhuǎn)換到 BSTR字符串
???????? CComBSTR?bstrTemp2(szInStr);
???????? *outStr??=?bstrTemp2.Detach();

總結(jié)

以上是生活随笔為你收集整理的com接口传入、传出字符串的说明和例程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。