UI Automation出现QueryInterface 调用异常

在使用UI Automation的findFirst查找控件的时候出现了以下异常:

执行了 QueryInterface 调用,请求提供 COM 可见的托管类“MS.Internal.AutomationProxies.WindowsEditBox”的类接口。不过,由于该类是从非 COM 可见的类“MS.Internal.AutomationProxies.ProxyHwnd”派生的,QueryInterface 调用将失败。这样做的目的是避免非 COM 可见的基类受 COM 版本规则的约束。

后来发现如果不使用AutomationElement.NameProperty属性查找就没问题

使用UI Spy检查控件属性,属性值为空。原来如此。

`QueryInterface` 是 COMComponent Object Model)接口模型中用于实现多态的关键函数。它在 `IUnknown` 接口中定义,其他接口通常会继承这个功能。这个函数的作用是让一个对象能够查询并返回其支持的指定接口。 参数详解如下: 1. **REFIID** `riid`: 这是请求的接口标识符(Interface Identifier),通过它可以识别特定的接口。当你想要从一个对象动态地获取另一个接口时,你需要传递该对象能提供哪个接口的 `IID`。比如,在D3D中,虽然不需要直接指定 `clsid`,但通过 `IID` 可以询问对象是否实现了 `ID3D11Device` 或者 `ID3D11ShaderResourceView` 等。 2. **void** `**ppvObject`: 一个指向 `void` 的指针数组,如果 `QueryInterface` 成功,这里会被设置为请求接口的实际指针。`**` 表示这是一个可变参数,允许函数修改它的值。 具体实现时,如引用[2]所示: ```cpp HRESULT QueryInterface(REFIID riid, void **ppvObject) { // 检查 riid 是否匹配已知的接口 if (riid == IID_ICar || riid == IID_IUnknown) // 示例中的 ICar 和 IUnknown 型 { // 创建并返回相应的接口实例 if (riid == IID_ICar) *ppvObject = static_cast<ICar*>(this); else *ppvObject = static_cast<IUnknown*>(this); // 返回成功状态 return S_OK; } else { // 不支持此接口,返回 E_NOTIMPL 错误 return E_NOTIMPL; } } ``` 如果你想要调用 `QueryInterface` 来获得一个对象的某个特定接口,你需要先知道你要的那个接口的 `IID`,然后将其传递给 `QueryInterface` 函数。如果对象支持该接口,函数会返回成功,并提供所需的接口指针;反之则返回不支持的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值