com接口传入、传出字符串的说明和例程
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接口传入、传出字符串的说明和例程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过CertEnroll在CA上(1创建
- 下一篇: 浏览器插件之ActiveX开发(二