执行drop

时间:2016-08-10 12:56:02

标签: winapi outlook

这是我的问题的描述:

我从outlook拖动邮件并将其放在我的表单上,所有这些方法都无法从丢弃事件发生时获得的IDataObject获取FileContents。:

1)我尝试过c ++ framework Qt ver 5.5。获得数据并得到这些结果:

可用的格式和每种格式收到的字节数:

"application/x-qt-windows-mime;value=\"RenPrivateSourceFolder\"" 206
"application/x-qt-windows-mime;value=\"RenPrivateLatestMessages\"" 420
"application/x-qt-windows-mime;value=\"RenPrivateMessages\"" 420
"application/x-qt-windows-mime;value=\"RenPrivateItem\"" 0
"application/x-qt-windows-mime;value=\"FileGroupDescriptor\"" 668
"application/x-qt-windows-mime;value=\"FileGroupDescriptorW\"" 1188
"application/x-qt-windows-mime;value=\"FileNameW\"" 0
"application/x-qt-windows-mime;value=\"FileContents\"" 0
"application/x-qt-windows-mime;value=\"Object Descriptor\"" 194
"text/plain" 166
"application/x-qt-windows-mime;value=\"Csv\"" 98

如您所见,FileContents格式返回零bytearray。

2)好的,我认为这个问题可能与qt实现了拖放操作有关,所以我实现了实现IDropTarget接口的win API方法,涉及注册我的窗口以便能够捕获

掉落事件。当drop事件发生时,我得到IDataObject,它必须包含被删除的数据。

但结果是一样的。我得到了FileContents结构的零bytearray。以下是我的代码片段:

STDMETHODIMP QDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,

                               POINTL pt, LPDWORD pdwEffect)
{
    static UINT cf = RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
    static FORMATETC fmtetc = { cf, 0, DVASPECT_CONTENT, 0, TYMED_HGLOBAL };
    //getting the description of the files being dropped
    STGMEDIUM medium;
    HRESULT hr = pDataObj->GetData(&fmtetc, &medium);
    if (!FAILED(hr))
    {
        FILEGROUPDESCRIPTOR* files = static_cast<FILEGROUPDESCRIPTOR*>(GlobalLock(medium.hGlobal));
        int items_count=files->cItems;
        for (int i=0;i<items_count;i++){
            QString filename=QString::fromWCharArray(files->fgd[i].cFileName).toUtf8().data();//getting filenames - works as expected
        }
        static UINT cf = RegisterClipboardFormat(CFSTR_FILECONTENTS);
        static FORMATETC fileContentFormat = { cf, NULL, DVASPECT_CONTENT,0, TYMED_HGLOBAL|TYMED_ISTORAGE|TYMED_ISTREAM};
        STGMEDIUM medium2;
        HRESULT hr2 = pDataObj->GetData(&fileContentFormat, &medium2);
        if (!FAILED(hr2))
        {
            qDebug()<<GlobalSize(medium2.hGlobal);//zero result 
            qDebug()<<(medium2.pstg==NULL);//zero result
            qDebug()<<(medium2.pstm==NULL);//zero result
            qDebug()<<"Filecontents extracted";

      .......

3)我加载了ClipSpy实用程序,它允许删除文件的形式,并显示可用的格式和每种格式所代表的结构的大小。并且filecontent大小为零。

你能告诉我这是一个前景问题吗? Outlook是否真的能够通过WINAPI方法通过COM对象拖放消息内容?提前感谢。

1 个答案:

答案 0 :(得分:0)

似乎开发人员在Outlook中并没有坚持使用article中描述的拖拽Windows的一般方法。我已经microsoft forum询问了,开发人员的回答是:

  

MSDN文章是shell数据传输的一般描述。一世   为您提供了特定于Outlook实现方式的解决方案   拖放。