今天在实现DragDrop时遇到一个奇怪的问题,就是在IDropTarget::DragEnter时传入的IDataObject*,我调用它的EnumFormatEtc函数时总是返回失败,这个IDataObject是我自己在另一个进程中实现的,于是我在那边加了断点和MessageBox,结果发现这边调用EnumFormatEtc时根本没有走到我另一个进程的实现中来!我开始怀疑是本进程中的代理对象实现有问题,但在同一个地方我调用这个IDataObject的另一个函数QueryGetData就可以成功,难道OLE实现IDataObject的参数列集时没有处理参数类型为IEnumFORMATETC的函数?真是百思不得其解。代码大致是这样的:class KDropTarget : public KComObjectRoot<IDropTarget, &IID_IDropTarget>
{
public:
virtual HRESULT STDMETHODCALLTYPE DragEnter( 
/* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
/* [in] */ DWORD grfKeyState,
/* [in] */ POINTL pt,
/* [out][in] */ DWORD __RPC_FAR *pdwEffect)
{
HRESULT hr = S_OK; FORMATETC fmetc;
memset(&fmetc, 0, sizeof(fmetc));
fmetc.cfFormat = CF_UNICODETEXT;
hr = pDataObj->QueryGetData(&fmetc);   // 这个调用成功了
if (SUCCEEDED(hr))
{
ASSERT(1);
} IEnumFORMATETC* pEnum = 0;
hr = pDataObj->EnumFormatEtc(DATADIR_GET, &pEnum);   // 这个返回E_XXX
if (SUCCEEDED(hr))
{
ASSERT(1);
pEnum->Release();
} *pdwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
return S_OK;
}   另外,我从WORD中拖动一段文字到我的窗口上时,后面的这个调用却是成功的。看起来是我的IDataObject实现得有问题,但同是这个IDataObject放到Clipboard上,却可以粘贴到WORD中,不知道为什么。高手救命呀!!!