MFC:检索已删除的数据,就像它们是文件一样

时间:2015-12-10 16:40:10

标签: file winapi com mfc drag-and-drop

如何从放置操作中检索全局数据,就像这些数据是文件一样?据我所知(在互联网和Jeff Procise's "Programming Windows with MFC (2nd ed.)"中,{{1}应该是答案,但是我做错了,因为MFC COleDataObject::GetFileData对象是创建的,但带有"无效句柄"值(-1)。

实际上,我试图在我的应用程序的两个实例之间传输虚拟文件(那些实际上不存在于本地驱动器上的文件)。通过HDROP和API DragQueryFile(也就是导出或导入物理文件),传输在我的应用程序和Windows资源管理器(或类似)之间正常工作。

这是启动拖动的代码(使用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对象与延迟渲染结合使用?然而,我可以通过全局内存指针访问延迟渲染数据。

非常感谢任何帮助/建议,非常感谢提前: - )

托马斯

1 个答案:

答案 0 :(得分:1)

嗯,毕竟它有意义 - CFile :: m_hFile等于INVALID_HANDLE_VALUE,因为那里没有真正的物理文件,但是instad只是一些非文件数据的抽象。所以上面的代码工作正常 - 只是我没有进一步完成测试而不是检查内部文件句柄,看到-1那里。

问题因此得到解决并吸取了教训: - )