这是我的问题的描述:
我从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对象拖放消息内容?提前感谢。
答案 0 :(得分:0)
似乎开发人员在Outlook中并没有坚持使用article中描述的拖拽Windows的一般方法。我已经microsoft forum询问了,开发人员的回答是:
MSDN文章是shell数据传输的一般描述。一世 为您提供了特定于Outlook实现方式的解决方案 拖放。