如何从放置操作中检索全局数据,就像这些数据是文件一样?据我所知(在互联网和Jeff Procise's "Programming Windows with MFC (2nd ed.)"中,{{1}应该是答案,但是我做错了,因为MFC COleDataObject::GetFileData
对象是创建的,但带有"无效句柄"值(-1)。
这是启动拖动的代码(使用CFSTR_FILEDESCRIPTOR和CFSTR_FILECONTENTS格式传输实际上不存在于本地磁盘上的虚拟文件):
CFile
这是接受放置的代码(如果通过// - allocate and fill in the FileGroupDescriptor structure
HGLOBAL hg=::GlobalAlloc( GHND|GMEM_SHARE, ... );
LPFILEGROUPDESCRIPTOR pfgd=::GlobalLock(hg);
...
::GlobalUnlock(hg);
// - create an IDataObject instance and put the FileGroupDescriptor structure into it
// (it holds that cfDescriptor=::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR) )
CCustOleDataSource obj=... // COleDataSource-derived object
FORMATETC etcFileGroupDescriptor={ cfDescriptor, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
obj.CacheGlobalData( cfDescriptor, hg, &etcFileGroupDescriptor );
// - render the actual data upon request
// (it holds that cfContent=::RegisterClipboardFormat(CFSTR_FILECONTENTS) )
FORMATETC etcFileContents={ cfContent, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
obj.DelayRenderFileData( cfContent, &etcFileContents );
// - perform drag&drop
obj.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE);
检索数据时效果正常,但在使用COleDataObject::GetGlobalData
时不起作用):
COleDataObject::GetFileData
这是一个非常重要的问题:实际上是否可以将CFile对象与延迟渲染结合使用?然而,我可以通过全局内存指针访问延迟渲染数据。
非常感谢任何帮助/建议,非常感谢提前: - )
托马斯
答案 0 :(得分:1)
嗯,毕竟它有意义 - CFile :: m_hFile等于INVALID_HANDLE_VALUE,因为那里没有真正的物理文件,但是instad只是一些非文件数据的抽象。所以上面的代码工作正常 - 只是我没有进一步完成测试而不是检查内部文件句柄,看到-1
那里。
问题因此得到解决并吸取了教训: - )