【问题标题】:Max length of data returned from UIAutomation callUIAutomation 调用返回的最大数据长度
【发布时间】:2017-04-01 06:42:29
【问题描述】:

我正在开发一个 Windows 7 C++ 程序,该程序将捕获屏幕上的文本。微软的 UIAutomation 框架似乎是最好的方法。除了一件事——当我使用框架的函数来获取文本时,我已经让它工作得很好,它似乎只返回了前一百万个字符。这可能看起来很多,但尝试列出硬盘驱动器上的每个文件,它很快就会达到数百万个字符的范围。我尝试了两种不同的方式来获取该文本,两种方式都返回相同的内容,并且都限制为前一百万个字符。

以下是代码示例:

IUIAutomationElement *element = findElement();

VARIANT v;
VariantInit(&v);

element->GetCurrentPropertyValue(UIA_LegacyIAccessibleValuePropertyId, &v);

BSTR tempString = V_BSTR(&v);

当文本数量少于一百万个字符时,一切都按预期工作,但任何超过该限制的内容都会被截断。

我假设可能有两个地方出现问题。首先,一个 VARIANT 可能只能容纳一百万个字符,但这似乎是不正确的,基于我对微软实现的 VARIANT 的了解。第二个是 GetCurrentPropertyValue() 调用最多只能返回一百万个字符。这很糟糕,因为我看不到解决办法。

请注意,我也使用 IUIAutomationValuePattern 和 IUIAutomationTextRange 完成了此操作,但产生的结果相同。

有什么想法吗?

【问题讨论】:

    标签: c++ ui-automation


    【解决方案1】:

    在对代码进行更多检测后,我意识到我关于 VARIANT 能够容纳超过一百万个字符的断言是错误的。实际发生的是,我从 VARIANT 中提取的 BSTR 保存了所有数据,因此它根本没有截断。真正发生的是,我从 BSTR 创建的 wstring(为了便于字符串操作)正在截断。好像

    wstring(tempString);
    

    只会给我一个最多一百万个字符的字符串。所以,虽然我还没有解决问题,但我已经成功地进一步缩小了罪魁祸首,而且至少这是一个易于处理的问题,因为我实际上并没有丢失数据。

    编辑:我对 wstring 处理超长字符串的能力也是错误的。如果我只看 wstring 的长度,我会发现它正确地复制了 BSTR。这是一种解脱。

    限制为一百万个字符的是 Visual Studio 2015 的字符串检查工具——无论何时我查看 wstring 的内容,它都不会超过一百万个字符。

    所以,感谢您帮助我完成了这段自我发现之旅——这里没有更多可看的了。向前走。继续前进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2017-12-15
      • 2022-11-23
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多