gpt4 book ai didi

c# - 在用 C++ 编写的 COM 客户端中抛出空返回值异常

转载 作者:太空宇宙 更新时间:2023-11-04 14:02:34 25 4
gpt4 key购买 nike

我在 C# dll 上制作了一个 COM 包装器,我在 C++ 中使用这个 COM 组件来调用 C# dll 中的方法。

除了当我的 C# 方法通过 COM 向 C++ 返回 null 时,一切正常。在 C++ 中抛出一个异常,上面写着

“调试断言失败!” ..... atlsafe.h 第 235 行表达式 psaSrc != null。

如何避免此错误并在返回类型中接受空值。

例如。

CComSafeArray itemEntities = objController1->ListItems(sPath);

当 ListItems 方法返回 null 时,系统不应抛出错误。相反,itemEntities 应该是 st 到 NULL。

请有人提出解决方案。

谢谢,加根

最佳答案

它一定是您代码中没有显示的部分。这对我有用:

C#类:

[ComVisible(true)]
[Guid("BE55747F-FEA9-4C1F-A103-32A00B162DF0")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Test
{
//[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
public string[] GetStringArray()
{
var a = new string[3];
a[0] = "string0";
a[1] = null;
a[2] = "string2";
return a;
}

public string[] GetStringArray2()
{
return null;
}
}

从 C++ 调用 GetStringArrayGetStringArray2:

SAFEARRAY* pSA = NULL;
testObject->GetStringArray(&pSA);
printf("str0: %ls\n", ((BSTR*)(pSA->pvData))[0]);
printf("ptr1: %x\n", ((BSTR*)(pSA->pvData))[1]);
printf("str2: %ls\n", ((BSTR*)(pSA->pvData))[2]);

SAFEARRAY* pSA2 = NULL;
testObject->GetStringArray2(&pSA2);
printf("pSA2: %x\n", pSA2);

运行:

str0: string0
ptr1: 0
str2: string2
pSA2: 0

我不必指定如何编码数组(注释掉的行),因为默认情况下它被编码为 SAFEARRAY(VT_BSTR)

已编辑: 我想我明白问题出在哪里了。您正在使用 ATL CComSafeArray,它在设计上不期望 NULL SAFEARRAY:

CComSafeArray(_In_ const SAFEARRAY *psaSrc) : m_psa(NULL)
{
ATLASSERT(psaSrc != NULL);
HRESULT hRes = CopyFrom(psaSrc);
if (FAILED(hRes))
AtlThrow(hRes);
}

您应该像这样更改您的代码:

CComSafeArray<BSTR> itemEntities;
SAFEARRAY* pItemEntities = objController1->ListItems(sPath);
if (NULL != pItemEntities)
itemEntities.Attach(pItemEntities);

或者,直接赋值m_psa:

CComSafeArray<BSTR> itemEntities
itemEntities.m_psa = objController1->ListItems(sPath);
if (!itemEntities)
{
// NULL returned
}

关于c# - 在用 C++ 编写的 COM 客户端中抛出空返回值异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18545020/

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