将UIAutomation提供程序添加到Delphi控件(特别是网格)

mmm*_*mmm 7 delphi microsoft-ui-automation

我们的VCL Delphi应用程序有许多网格,我们需要通过UIAutomation开始与之交互.有许多问题,尤其是TStringGrid没有实现任何IUIAutomation模式(IGridProvider或ITableProvider,或者甚至是IValueProvider).

我试图找出我需要添加到TStringGrid以允许它实现提供程序(在.NET中的System.Windows.Automation.Provider命名空间中).

Del*_*ics 2

尽管我无法提供在TStringGrid上实现您所需的自动化功能所需的具体步骤,但我可以说,根据评论,您几乎拥有所需的一切。

您发现描述 Win32 非托管代码的 UI 自动化支持的基本实现的文章是一个很好的起点。

然后,有关通过UIAutomationCore.DLL中的 IDL 公开什么和不公开什么的问题可以通过以下事实得到解决:相关 DLL 本身旨在由非托管代码使用。它本身不包含托管代码。至少在非托管用例中不涉及这一点。

它包含的是由 IDL 描述的 COM 接口,还有一些由 DLL 简单导出的函数。据我所知,IDL没有描述DLL的导出表。即使它能够这样做,对于这个 DLL 来说它也不能(至少不是在所有情况下)。

例如,您提到的UiaHostProviderFromHwnd()函数就是一个简单的 DLL 导出。这篇 MSDN 博客文章描述了以这种方式导出的一些附加功能,该文章描述了为此库创建 .net 互操作接口。在那篇文章中,它们被称为“平面 API 方法”。

使用PE Explorer,我可以看到UIAutomationCore.dll库导出的 81 个此类函数。

不幸的是,DLL 导出表不描述任何导出函数的参数或返回类型,仅描述名称。因此,除了类型库(从 IDL 生成)之外,您还需要找到并转换UIAutomationCore.h 标头文件以与 Delphi(即 Pascal)一起使用。

然后,您应该拥有为您想要的任何 VCL 控件实现 UI 自动化功能所需的一切。