【问题标题】:Do I need to DeleteObject to dispose of an HBITMAP* when using [ComImportAttribute()]?使用 [ComImportAttribute()] 时是否需要 DeleteObject 来处理 HBITMAP*?
【发布时间】:2014-02-07 04:34:10
【问题描述】:

来自MSDN about IShellItemImageFactory::GetImage

调用者有责任释放这个检索到的资源 不再需要时通过DeleteObject

我的问题是:

我在IShellItemImageFactory.GetImage 调用中使用IntPtr,其中IShellItemImageFactory[ComImportAttribute()] 装饰。我是否还需要调用DeleteObject,或者当CLR(?) 尝试将其作为Factory 的一部分删除时会造成麻烦?

【问题讨论】:

  • @HansPassant 我不明白你的评论。这正是我所引用的。我的问题是使用 ComImportAttribute 时会发生什么 - 这是否会使使用 DeleteObject 成为一件坏事,或者它不会改变任何东西。
  • 您可能想查看Windows API Code Pack 或现在更新的版本nuget.org/packages/Windows7APICodePack
  • @Mgetz 谢谢。但这就是我到现在为止一直在使用的东西,而这正是我想要避免的——将所有这些都用于一点点。

标签: c# .net winapi


【解决方案1】:

CLR 将从不自动释放 IntPtr。它不可能知道需要调用什么特定的函数来释放指针。调用 DeleteObject() 完全取决于您。

【讨论】:

  • 好的。谢谢。 (我实际上问这个主要是因为你的另一个答案 here 你说:it is automatic, just like .NET objects. 并说 Disposing 可能是 a good way to shoot your foot though。我认为这也适用于这里。再次感谢。
  • 那个答案是关于 COM 接口指针,而不是 IntPtr。 CLR 对接口指针了解很多,首先它会自动创建一个 RCW。你不能比较两者。
  • 抱歉继续,但这里的另一个答案说我不仅要 DeleteObject IntPtr,还需要 FinalReleaseCOMObject IShellItemImageFactory .我从您的其他回答中了解到,至少应该这样做。是哪一个?
  • 好的。没关系。我看到他现在删除了他的答案。再次感谢。
猜你喜欢
  • 2015-09-12
  • 2011-08-01
  • 2010-11-07
  • 2022-01-09
  • 2015-10-20
  • 2018-10-25
  • 2023-04-05
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多