假设我在自定义控件中实现了一些UIA模式。比如说,TablePattern
。如果出现任何错误,现有的实现都会返回null。但是调试起来不是很方便。我可能对自动化同级有更多的背景知识。例如,对于GetItem(int row, int column)
,我可能会说所提供的参数是越界的,而不仅仅是返回null。
如果我抛出一个来自自动化对等体的异常--在UIA客户端,我从IUIAutomationPatternInstance
对象得到TargetInvocationException
,没有任何细节(InnerException属性为空)。
有没有办法让UIA将错误和一些附加信息从UIA服务器端传递到UIA客户端?
更新:在与评论中提供的example @SimonMourier进行了一些调查和比较后,我发现TargetInvocationException
是我的错。修复了here。
现在我得到了正确的异常类型,但只有一条标准的异常消息。对于IndexOutBoundsException
,它是“索引超出了数组的界限”。不管我在UIA服务器端尝试的异常是什么。
不同的是,我试图不通过标准的托管UIAutomationClient调用UIA方法,而是使用我自己的代码一直到COM调用(标准的托管库不支持我想使用的自定义UIA模式)。标准库可以很好地传递异常消息。我试着追踪它们的不同之处,发现了以下几点:
private static extern int RawGridPattern_GetItem(SafePatternHandle hobj, int row, int column, out SafeNodeHandle pResult);
的方法通过InternallCall here调用P/Invoke。它返回HRESULT,这是由CheckError
方法通过调用Marshal.ThrowExceptionForHR(hr);
来处理的。在这一点上,异常和正确的消息出现,就像在UIA服务器side.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 call。根据我对COM Interop的理解,重写返回值机制会自动检查HRESULT,必要时抛出异常,否则返回out result
参数。除了异常消息由于某种原因不能被翻译之外,它确实是这样。要重现这个问题,您可以尝试使用this project。lib文件夹中的文件是从this repository构建的。如果ConsoleApplication1引用UIAComWrapper库- exception附带默认消息。如果您将引用更改为使用标准UIAutomationClient -它将接收自定义引用。
https://stackoverflow.com/questions/31518124
复制相似问题