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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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


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

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

實現代碼為

STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr)
{
/*
?
?????? 相關類型轉換:
????????? 從BSTR字符串轉換到Unicode字符串(例如LPOLESTR)不是必須的,即不需要轉換,可以當作一個Unicode字符串使用
????????? 從Unicode字符串轉換到BSTR字符串必須經過相應的API函數 SysAllocString。

????????? 從標準C的字符串轉換到Unicode字符串需要使用MultiByteToWideChar函數。
????????? 從Unicode字符串轉換到標準C的字符串需要使用WideCharToMultiByte函數。

????????? 總結:由此可見,使用Unicode字符串當作中介,則可以在標準C的字符串和BSTR字符串之間相互轉換!

????????? 函數流程:
???????????? 將傳入的字符串 inStr通過轉換函數轉換成相應的標準C字符串 szInStr,通過標準C的大寫轉換函數將szInStr轉換成大寫。
???????????? 將szInStr通過轉換函數轉換成BSTR字符串 outStr,作為返回值輸出

???
????????? 補?充:
????????????? 從C標準字符串轉換到BSTR字符串,如果在ATL中使用類 CComBSTR,則轉換可以相當簡化,只需要一行代碼
????????????? //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字符串 轉換成 C標準字符串
??????? //
??????? WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
??????? szInStr?=?strupr(szInStr);

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

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

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

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

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


//以下為按照補充中說明的使用 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標準字符串 直接轉換到 BSTR字符串
???????? CComBSTR?bstrTemp2(szInStr);
???????? *outStr??=?bstrTemp2.Detach();

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。