我正在尝试 (i) 在 COM 边界上获得一个安全的 long 数组,并且 (ii) 为方便起见,使用 CComSafeArray。

我的问题是我在设置 COM 属性后遇到了不可预测的崩溃(请参阅下面的 pPrologue->EligibleProducts = var; )。我发现很难从 Microsoft 文档中理解如何使用 CComSafeArray,谁能解释一下?先感谢您!

在 IDL 我有:

[propget, id(1), helpstring("property EligibleProducts")] HRESULT EligibleProducts([out, retval] VARIANT* pVal);
[propput, id(1), helpstring("property EligibleProducts")] HRESULT EligibleProducts([in] VARIANT newVal);

我的服务器代码是:
STDMETHODIMP CPrologue::put_EligibleProducts(VARIANT newVal)
{
    HRESULT hr = E_FAIL;

    AFX_MANAGE_STATE(AfxGetStaticModuleState())

    //start by clearing out any existing data
    m_EligibleProducts.clear();

    if(newVal.vt | (VT_ARRAY & VT_I4))
    {
        //construct a wrapper class with the passed in SAFEARRAY
         CComSafeArray<long> wrapper;
         wrapper.Attach(newVal.parray);

         int iProductID = 0;

         //loop through products and add them to our vector
         int iCount = wrapper.GetCount();
         for(int iIndex = 0; iIndex < iCount; iIndex++)
         {
             iProductID = wrapper.GetAt(iIndex);
             if(iProductID > 0)
             {
                 m_EligibleProducts.push_back(iProductID);
             }
         }

         hr = S_OK;

    return hr;
}

我的调用代码是:
                VARIANT var;
                ::VariantInit(&var);
                var.vt = VT_ARRAY | VT_I4;

                CComSafeArray<long> wrapper;

                for(std::vector<long>::const_iterator it = products.begin(); it != products.end(); it++)
                {
                    wrapper.Add(*it);
                }

                //get the SAFEARRAY from the wrapper
                var.parray = wrapper.Detach();

                //and store it on the appropriate business object
                IProloguePtr pPrologue = pCustomer->Prologue;
                **pPrologue->EligibleProducts = var;**

                //clean up the variant (and hence SAFEARRAY)
                ::VariantClear(&var);

最佳答案



这并不像你认为的那样。此条件始终为真。您正在寻找 if (newVal.vt == VT_ARRAY | VT_I4)
put_EligibleProducts 中,你有 Attach ed CComSafeArray 指向 VARIANT 内的指针,但你没有分离它。当 wrapper 超出范围时,它会破坏安全数组。然后调用者第二次尝试通过 VariantClear 销毁它。这是您遇到困难的直接原因。

关于c++ - 跨 COM 边界传递 CComSafeArray,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17665020/

10-13 07:09