100分请教剪贴板复制虚拟文件的问题.不够再加.

pclili 2012-06-20 11:58:58
正在做用剪贴板复制虚拟文件(比如FTP上下载文件等),碰到了一些问题.如下:
我实现了IDataObject接口和IEnumFORMATETC接口.
调用OleSetClipboard将IDataObject对象设置到剪贴板,跟踪到的流程是:
调用OleSetClipboard时,会首先调用IDataObject接口的EnumFormatEtc函数,我在这函数的实现里创建一个IEnumFORMATETC对象返回,接着会调IEnumFORMATETC接口的reset函数和next函数,在next函数里我给LPFORMATETC结构指针赋了值,
在Next函数里不能返回S_OK,只要返回S_OK,系统就会一直调用Next函数.如果返回S_FALSE,则只会调用两次.
问题1: 为啥在Next函数里不能返回S_OK.在里面应该怎么给LPFORMATETC结构指针赋值,
我的实现是:
FORMATETC& fmt1 = *pFormatetc;
fmt1.cfFormat = CF_FILEDESCRIPTOR;
fmt1.dwAspect = DVASPECT_CONTENT;
fmt1.lindex = -1;
fmt1.ptd = NULL;
fmt1.tymed = TYMED_HGLOBAL;

如果在Next函数里返回S_FALSE,在windows explorer里点击右键菜单时,会调用IDataObject接口里的GetData函数,在win7下FORMATETC结构里的cfFormat变量是49384,在xp下是49316,我的实现是:
if(pFormatetc->cfFormat == 49384)
{
FILEGROUPDESCRIPTOR fgd = { 1/*m_aFiles.GetSize()*/, 0 };
DWORD dwFgdSize = sizeof(fgd) - sizeof(FILEDESCRIPTOR);
DWORD dwTotalSize = dwFgdSize + (sizeof(FILEDESCRIPTOR) * 1/*m_aFiles.GetSize()*/);
int8* buffer( new int8[dwTotalSize] );
if(buffer == NULL)
return E_OUTOFMEMORY;

FILEDESCRIPTOR fd = {0};
fd.dwFlags = (DWORD)(FD_FILESIZE | FD_ATTRIBUTES | 0x80000000);

fd.nFileSizeLow = 100;//_AtlModule.m_pIPhone->GetFileSize(path);
_tcscpy(fd.cFileName, _T("4ec4aa6b.ogg"));

::CopyMemory(buffer, &fgd, dwFgdSize);
::CopyMemory(buffer + dwFgdSize, &fd, sizeof(FILEDESCRIPTOR) * 1/*m_aFiles.GetSize()*/);
HRESULT hr = SetHGLOBAL(pMedium, buffer, dwTotalSize);
return hr;
}
else if(pFormatetc->cfFormat == 49316)
{
DWORD dwDropEffect = DROPEFFECT_COPY;
return SetHGLOBAL(pMedium, &dwDropEffect, sizeof(dwDropEffect));
}
但粘贴那一项不可用.
问题2: 为啥不可用,是不是我的实现有错?

问题3: 能否给个简单的例子参考.

在网上也找过好多,也看过MSDN,可还是有问题,请各位帮帮忙.谢谢.
...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小菩提的尾巴 2012-08-11
  • 打赏
  • 举报
回复
楼主怎样监听粘贴事件呢,我最近也遇到了类似的问题,能否给份代码参考下,对于com编程不太懂,先谢了lester2008@163.com
pclili 2012-06-20
  • 打赏
  • 举报
回复
在线等待,解决马上结贴.谢谢.
pclili 2012-06-20
  • 打赏
  • 举报
回复
程序挂的问题是另一个问题引起的,跟这个拷贝无关.
目前算是可以复制虚拟文件了,但还不知道自己实现的IEnumFORMATETC接口有啥问题.
pclili 2012-06-20
  • 打赏
  • 举报
回复
现在已经可以复制文件了,但好像还有些小问题.
是我自己实现的IEnumFORMATETC有问题,但我现在还不知道哪里出了问题,目前解决办法是使用SHCreateStdEnumFmtEtc来创建IEnumFORMATETC对像,这样居然可以...

还有一个问题就是在程序退出时会挂掉,还要进一步调试.
pclili 2012-06-20
  • 打赏
  • 举报
回复
我是想把虚拟文件拷贝到剪贴板里,然后在粘贴时真正执行拷贝动作,把虚拟文件真正拷贝到磁盘上.
感谢你的回复.
liuli7786 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
CopyMemory改成memcpy没用,问题依旧.
[/Quote]
你这段程序是想把虚拟文件拷贝到剪贴版里,可以这么理解吗?
pclili 2012-06-20
  • 打赏
  • 举报
回复
CopyMemory改成memcpy没用,问题依旧.
liuli7786 2012-06-20
  • 打赏
  • 举报
回复
::CopyMemory-->拷贝内存内容改用memcpy这个函数试一下
pclili 2012-06-20
  • 打赏
  • 举报
回复
怎么没人回复我的呀....

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧