【问题标题】:Why would the Win32 OleGetClipboard() function return CLIPBRD_E_CANT_OPEN?为什么Win32 OleGetClipboard() 函数会返回CLIPBRD_E_CANT_OPEN?
【发布时间】:2008-09-26 13:58:57
【问题描述】:

Win32 API函数OleGetClipboard()在什么情况下会失败并返回CLIPBRD_E_CANT_OPEN

更多背景信息:我正在协助修复 Firefox 错误。详情在这里:

bug 444800 - cannot retrieve image data from clipboard in lossless format

在我帮助编写的自动化测试中,我们看到 OleGetClipboard() 有时会失败并返回 CLIPBRD_E_CANT_OPEN。这是出乎意料的,从 Windows 剪贴板中提取图像数据的 Firefox 代码取决于该调用是否成功。

【问题讨论】:

    标签: c++ windows winapi ole


    【解决方案1】:

    文档说如果OpenClipboard 失败,OleGetClipboard 可能会失败并显示此错误代码。反过来,如果您阅读该文档,它会说:

    “如果另一个窗口打开了剪贴板,OpenClipboard 将失败。”

    这是一种专有资源:一次只能在一个窗口中打开剪贴板。基本上,如果你做不到,请稍等片刻,然后再试一次。

    【讨论】:

    • 这似乎是迄今为止最接近的答案。我们发现,如果我们允许在将测试 BMP 复制到剪贴板的时间和调用 OleGetClipboard() 的时间之间发生上下文切换(通过在测试代码中添加 JavaScript setTimeout(..., 0)),问题消失了。
    【解决方案2】:

    您的测试是否在终端服务上运行?见CLIPBRD_E_CANT_OPEN error when setting the Clipboard from .NET

    【讨论】:

      【解决方案3】:

      从我在 MSDN 中看到的情况来看,这似乎暗示问题出在试图将数据实际放入剪贴板的人 in 中,即数据的来源。如果他们对 OleSetClipboard() 的调用失败,无论出于何种原因,您将无法提取内容。 我会看看数据是如何被放入剪贴板的,看看是否有一个测试用例执行这个(将数据复制到剪贴板),然后导致你正在谈论的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 2017-07-16
        • 1970-01-01
        相关资源
        最近更新 更多