winapi - 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()
蒂亚!!
解决方案
推荐阅读
- android - 如何实现获取和返回 LifeCycle 的方法
- java - 将 MyObject 的页面映射到 MyObjectDTO 的页面
- javascript - Chart.js 鼠标悬停显示旧图表数据
- django - 如何删除 django-extra-views 中的行?
- oauth - 当您拥有消费者密钥、秘密、令牌和令牌密钥时生成 oauth_Signature 的代码
- reactjs - 在 React Web 应用程序中定义联系我们表单的模型时如何包含 textarea 字段
- ansible - 如何将目录从远程机器复制到本地主机?
- javascript - 有没有办法修改数组中允许的值的标准?
- kubernetes - 如何为 istio 入口网关添加自定义端口?
- ssl - 需要从在线提供商处创建公钥基础设施的指导