100分请教剪贴板复制虚拟文件的问题.不够再加.
正在做用剪贴板复制虚拟文件(比如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,可还是有问题,请各位帮帮忙.谢谢.