在用C++编写的COM客户端中引发异常的Null返回值
Null return value throwing Exception in COM client written in C++
我在C#dll上制作了一个COM包装器,并在C++中使用这个COM组件来调用C#dll中的方法。
除了当我的C#方法通过COM向C++返回null时,一切都很好。在C++中抛出一个excpetion,上面写着
"调试断言失败!"。。。。。atlsafe.h 235号线表达式psaSrc!=无效的
如何避免此错误并接受返回类型中的null值。
例如
CComSafeArray项实体=objController1->ListItems(sPath);
当ListItems方法返回null时,系统不应该抛出错误。相反,itemEntities应该是st到NULL。
请有人提出解决方案。
谢谢,Gagan
它一定是代码中没有显示的部分。这对我有效:
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++调用GetStringArray
和GetStringArray2
:
SAFEARRAY* pSA = NULL;
testObject->GetStringArray(&pSA);
printf("str0: %lsn", ((BSTR*)(pSA->pvData))[0]);
printf("ptr1: %xn", ((BSTR*)(pSA->pvData))[1]);
printf("str2: %lsn", ((BSTR*)(pSA->pvData))[2]);
SAFEARRAY* pSA2 = NULL;
testObject->GetStringArray2(&pSA2);
printf("pSA2: %xn", 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
}
COM中的返回值是保留的,用于将异常传递给不同的模块。要获得一个真实的返回值,可以在函数中添加一个out参数,并将其用作返回值。我以为C#互操作系统已经为您完成了这项工作,但似乎您需要手动完成。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 当返回值丢失时,C++ 代码行为异常
- 为什么访问模板化变体作为返回值抛出异常
- 动态指针引用数组由三元运算符返回值,但有异常
- 遇到异常时给定函数的返回值是多少
- 如何将枚举返回值转换为C 异常
- C++:如何通过异常处理从越界数组返回值
- 在用C++编写的COM客户端中引发异常的Null返回值