首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从UI自动化模式提供程序返回错误?

如何从UI自动化模式提供程序返回错误?
EN

Stack Overflow用户
提问于 2015-07-20 21:43:43
回答 1查看 1.4K关注 0票数 16

假设我在自定义控件中实现了一些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.
  • UIAComWrapper上抛出的一样,我使用的它做的似乎是在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 -它将接收自定义引用。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31518124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档