【问题标题】:How to use BSTR*如何使用 BSTR*
【发布时间】:2011-09-03 03:12:35
【问题描述】:

对于 C++ COM dll 中的接口,我有一个 out 值作为 BSTR*。我将其返回给 C# .Net 客户端。在我的 C++ 函数中,我必须根据差异条件分配不同的值。

例如:

If my function is fun(BSTR* outval)
{
   // I have to assign a default value to it such as:
   *outval = SysAllocSTring(L"N");

   Then I will check for some DB conditions
   { 
     // And I have to allocate it according to that.
     // Do I need to again calling SysAllocString?
     eq.*outval = SySAllocString(DBVlaue);
   }
}

如果我两次调用 SysAllocSTring 到同一个 BSTR 会发生什么?处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: com bstr


    【解决方案1】:

    如果你调用 SysAllocString 两次,你会泄漏第一个 BSTR。你不应该这样做。您可以改为在第一个 BSTR 上使用 SysFreeString,然后在第二个 BSTR 上使用 SysAllocString,或者更简单地调用 SysReAllocString 来重新分配现有的 BSTR 值。

    马丁

    【讨论】:

      【解决方案2】:

      除了 Martyn 回答的内容之外,您应该尝试使用 CComBSTR 来解决此问题,它会自动处理分配和释放 BSTR。

      顺便说一句,CComBSTR 类是RAII 的一个示例

      【讨论】:

        【解决方案3】:

        您必须处理所有BSTRs,除了您实际作为“out”参数传递的那个。您传递的 BSTR 不需要被释放 - 调用者负责释放它,而您的代码负责它可能分配的所有其他 BSTRs。

        如果你真的需要那些临时的BSTRs,你应该为那些临时的BSTRs 使用像ATL::CComBSTR_bstr_t 这样的包装类(但不是你传递出去的那个)。我想在你描述的情况下,你最好只重写你的代码,这样你就不需要在任何控制路径上创建更多的BSTR

        这是一些伪代码:

         HRESULT YourFunction( BSTR* result )
         {
             if( result == 0 ) {
                 return E_POINTER;
             }
             int internalStateValue = getState();
             if( internalStateValue > 0 ) { // first case
                 *result = SysAllocString( "positive" );
             } else if( internalStateValue < 0 ) { //second case
                 *result = SysAllocString( "negative" );
             } else { //default case
                 *result = SysAllocString( "zero" );
             }
             return S_OK;
          }
        

        【讨论】:

          【解决方案4】:

          如果你的函数定义为:

          HRESULT Foo(BSTR input){...}
          

          这样称呼:

          Foo(_bstr_t(L"abc"));
          

          【讨论】:

            猜你喜欢
            • 2017-03-17
            • 2021-01-31
            • 1970-01-01
            • 2012-01-23
            • 2016-11-02
            • 2010-10-11
            • 2011-04-24
            • 1970-01-01
            • 2019-10-24
            相关资源
            最近更新 更多