【问题标题】:CString to _bstr_t conversion C++CString 到 _bstr_t 转换 C++
【发布时间】:2013-12-23 04:10:57
【问题描述】:

我从另一个开发人员那里继承了一个 MFC 项目。在多个 MFC 方法下,调用 COM 服务器,将字符串作为参数传递。这是当前代码库中转换模式的代表性示例:

COM 服务器:

void COMServer::foo(_bstr_t strParam)

MFC方法:

void Foo::foo(CString &csParam)
{
     CComBSTR bstrParam(strDocName);
     ptrToComServer->foo((BSTR)bstrParam);
}

在阅读了这个article中的字符串转换规则后,我想知道当前的转换模式是否是

  • 从内存管理的角度来看是安全的
  • 就复制的字符串数量而言是有效的

关于以上两个顾虑,我也想知道下面的转换会不会更好

void Foo::foo(CString &csParam)
{
    _bstr_t bstrParam(csParam);
    ptrToComServer->foo(bstrParam);
}

【问题讨论】:

    标签: c++ com mfc


    【解决方案1】:

    应通过删除 (BSTR) 强制转换来改进旧版 MFC 方法。

    void Foo::foo(CString &csParam)
    {
         CComBSTR bstrParam(strDocName);
         ptrToComServer->foo(bstrParam);
    }
    

    我发现您的现有代码或新提案中没有内存损坏。 至于效率,我觉得这两种方法都差不多。

    如果您真的关心性能(您真的确定这很重要吗?您每秒会进行数千次 COMServer::foo 调用),那么您应该从(关于您的“字符串”)开始:

    1. 将您的项目设为 UNICODE(如果尚未完成),因为它可能会在您的 COM 调用之前为您带来更少的转换。
    2. 尝试尽快使用CComBSTR 或_bstr_t,最终避免CString 到BSTR 的复制/转换。

    【讨论】:

      【解决方案2】:

      请使用以下转换,

      CString aTestUser(_T("TestUser"));
      _bstr_t aConvertedUser(aTestUser);
      

      【讨论】:

      • 什么是 H*** 是一个ConvertedUser?
      猜你喜欢
      • 2023-04-01
      • 2014-08-23
      • 1970-01-01
      • 2018-03-20
      • 2020-06-12
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多