Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OLE剪贴板和经典剪贴板时出现意外/奇怪的结果,还是我遗漏了什么?_C++_Windows_Winapi_Clipboard_Ole - Fatal编程技术网

C++ 使用OLE剪贴板和经典剪贴板时出现意外/奇怪的结果,还是我遗漏了什么?

C++ 使用OLE剪贴板和经典剪贴板时出现意外/奇怪的结果,还是我遗漏了什么?,c++,windows,winapi,clipboard,ole,C++,Windows,Winapi,Clipboard,Ole,我正在尝试以下技巧: 我需要将IDataObject*设置到剪贴板中,因此我使用OleSetClipboard()将其设置到剪贴板中 我有另一个CLIPFORMAT我想添加到剪贴板,但是我不能用OleSetClipboard()来做,因为我收到的IDataObject*没有实现SetData()方法。因此,为了克服这个限制,我使用GetClipboardOwner()打开剪贴板(),这样,我就可以SetClipboardData()到剪贴板,而不必先EmptyClipboard() 现在,这一切

我正在尝试以下技巧:

  • 我需要将
    IDataObject*
    设置到剪贴板中,因此我使用
    OleSetClipboard()
    将其设置到剪贴板中
  • 我有另一个
    CLIPFORMAT
    我想添加到剪贴板,但是我不能用
    OleSetClipboard()
    来做,因为我收到的
    IDataObject*
    没有实现
    SetData()
    方法。因此,为了克服这个限制,我使用
    GetClipboardOwner()
    打开剪贴板(),这样,我就可以
    SetClipboardData()
    到剪贴板,而不必先
    EmptyClipboard()
  • 现在,这一切都很好,但实际情况是,
    olegetclipboarddata()
    不会返回我使用
    SetClipboardData()
    放在剪贴板中的数据,但我可以使用
    GetClipboardData()

    我可以想象为什么会发生这种情况(它只返回
    IDataObject*
    ),因此我尝试
    OleFlushClipboard()
    删除
    IDataObject*
    ,并再次尝试
    OleGetClipboard()
    ,让操作系统重新构建一个新的
    IDataObject*
    ,而且它仍然不包含
    SetClipboardData()
    添加的
    CLIPFORMAT

    有人知道如何克服这个问题吗?还是另一个把戏?或者解释为什么它是这样工作的?谢谢

    我刚刚在Windows 7上尝试了这个功能,它似乎可以工作,但只是跨进程:

    • 在与剪贴板所有者不同的过程中,OleGetClipboard返回包含所有格式的数据对象(即数据对象的原始格式和添加到剪贴板的额外格式)
    • 在同一过程中,OleGetClipboard始终返回不包含额外剪贴板格式的数据对象
    在这两种情况下,调用OleFlushClipboard没有区别

    无论如何,这似乎不是一个非常健壮的解决方案。相反,您可以创建自己的数据对象,该对象响应它所知道的格式,并将其他格式委托给原始数据对象。EnumFormatEtc方法将组合两个对象的格式,依此类推。具有可以扩展的简单数据对象的框架。

    好主意:-)。我早该想到的!我猜有时候你只需要退一步。。。但是你知道为什么它是这样工作的吗?我找不到任何额外的数据来提示他在刷新之前所持有的类型的过程。