gpt4 book ai didi

c++ - 跨 COM 边界传递 CComSafeArray

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:33 27 4
gpt4 key购买 nike

我正在尝试 (i) 跨 COM 边界获取长整型安全数组,以及 (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))

这并不像您认为的那样。此条件始终为真。您正在寻找 if (newVal.vt == VT_ARRAY | VT_I4)

put_EligibleProducts 中,您已将 CComSafeArray 附加到 VARIANT 内的指针,但您尚未将其分离。当 wrapper 超出范围时,它会破坏 safearray。然后调用者试图通过 VariantClear 第二次销毁它。这是您遇到困难的直接原因。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com