现在的位置: 首页 > 综合 > 正文

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

2013年07月30日 ⁄ 综合 ⁄ 共 2303字 ⁄ 字号 评论关闭

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();

【上篇】
【下篇】

抱歉!评论已关闭.