假设我正在自定义控件中实现某些UIA模式,比如
如果我从自动化对等体中抛出异常-在UIA客户端端,我会从
有没有一种方法可以使UIA从UIA服务器端传递带有一些附加信息的错误到UIA客户端端?
TablePattern
。现有的实现如果出现任何错误都会返回null。但是这不太方便调试。我可能在自动化对等体中有更多的上下文。例如,对于GetItem(int row, int column)
,我可能会说提供的参数超出了范围,而不仅仅是返回null。如果我从自动化对等体中抛出异常-在UIA客户端端,我会从
IUIAutomationPatternInstance
对象得到TargetInvocationException
,但没有任何详细信息(InnerException属性为null)。有没有一种方法可以使UIA从UIA服务器端传递带有一些附加信息的错误到UIA客户端端?
更新:经过一番调查和与@SimonMourier评论中提供的示例进行比较,我发现TargetInvocationException
是我的问题。在这里进行了修复。
现在我得到了正确的异常类型,但只有标准异常消息。对于IndexOutBoundsException
,无论我在UIA服务器端尝试放入什么样的异常,它都是“索引超出了数组界限。”
区别在于,我正在尝试不通过标准托管UIAutomationClient而是使用我自己的代码一直到COM调用来调用UIA方法(标准托管库不支持我想要使用的自定义UIA模式)。标准库可以成功传递异常消息。我已经尝试跟踪区别并找到以下内容:
- 标准托管库通过在此处这里定义的方法通过InternallCall调用P/Invoke,方法定义为
private static extern int RawGridPattern_GetItem(SafePatternHandle hobj, int row, int column, out SafeNodeHandle pResult);
。它返回HRESULT,由CheckError
方法处理,通过调用Marshal.ThrowExceptionForHR(hr);
。此时,异常消息将作为在UIA服务器端抛出的消息出现。 - 我使用的UIAComWrapper似乎执行了相同的COM调用,定义在
c:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\UIAutomationClient.idl
中,如下所示:HRESULT GetItem ([in] int row, [in] int column, [out, retval] IUIAutomationElement ** element );
。根据我的COM Interop理解,重写返回值机制会自动检查HRESULT,如果必要,会抛出异常,否则返回out result
参数。它确实执行了这一点,但由于某种原因,异常消息没有被翻译。
GetLastError
一样。这不是很吸引人的解决方案(但当然可以实现)。 - Ivan Danilov