首页 > 解决方案 > MFC:有关如何在使用 COleDataSource::DoDragDrop() 后进行清理的冲突信息

问题描述

有人可以清除所有相互矛盾的信息。

的文档COleDataSource::CacheData()说:

在调用 CacheData 之后,lpFormatEtc 的 ptd 成员和 lpStgMedium 的内容由数据对象拥有,而不是由调用者拥有。

的文档COleDataSource::CacheGlobalData()没有这么说。

COleDataSource::DoDragDrop()您可以在 Code Project 之类的地方找到如何使用的代码示例,该示例调用COleDataSource::CacheGlobalData()然后检查DoDragDrop()结果并释放内存(如果它没有丢失):

DROPEFFECT dweffect=datasrc->DoDragDrop(DROPEFFECT_COPY);
// They say if operation wasn't accepted, or was canceled, we 
// should call GlobalFree() to clean up.    
if (dweffect==DROPEFFECT_NONE) {
  GlobalFree(hgdrop);
}

您还有 Q182219(由于某种未知原因,MS 完全破坏了所有旧的 MSKB 链接,您再也找不到任何信息(互联网上的链接都死了)。Q182219 在 NT 上成功移动操作后说了一些基于操作系统(Win10),它会返回DROPEFFECT_NONE,所以你必须检查事情是否真的移动了。

所以问题是:

1) 如果 drop 操作返回,你真的应该释放内存DROPEFFECT_NONE还是 MFC 会处理所有这些?

2) 移动操作成功后是否仍然返回DROPEFFFECT_NONE,或者 MFC 是否在内部处理(或在某些 Windows 版本中修复)?

3)如果它确实DROPEFFECT_NONE在移动后返回,那么如果它是移动操作,那么上述逻辑是否会在内存上双重释放?

额外的:

您还可以找到人们做错事的例子和用法COleDataSource mydatasource。您必须像分配它一样COleDataSource *mydatasource=new ColeDataSource(),然后在最终使用mydatasource->ExternalRelease()时释放它。(如果对象不使用聚合(即充当包装器的派生类),则ExternalRelease()处理调用)InternalRelease()

蒂亚!!

标签: winapidrag-and-dropmfcole

解决方案


推荐阅读