Windows 图标 (LoadImage) 句柄的生命周期是多少?

What is the lifetime of a Windows icon (LoadImage) Handle?

我正在编写一个小型 MFC 应用程序并在启动时在我的可执行文件中加载这样的图标句柄:

const HANDLE hIconLarge = ::LoadImage(AfxGetInstanceHandle()
   MAKEINTRESOURCE(IDI_EXAMPLE), IMAGE_ICON,
   ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), 0);

我在一个 DLL 中的另一个 class 中保留了相同的句柄,我通过简单地像这样分配它来创建它:

m_hLargeWindowIcon = p_hLargeIconHandle; 

其中 m_hLargeWindowIcon 是我称之为 IconManager 的单例中的私有 class HANDLE 变量。后来我偶尔使用这个图标句柄来设置我的 DLL 创建的弹出窗口 windows 的大图标。

它似乎工作正常,但我担心我保留的句柄的生命周期。

以这种方式保存句柄是否安全(即句柄将保持有效,直到我的 DLL 的主机进程终止)或者我可以 运行 解决句柄在以下情况下可能无效的问题我稍后再访问它?在这种情况下,我应该使用 DuplicateHandle 或类似性质的东西吗?

您不需要以任何方式复制句柄。除了您使用的类型错误之外,您的用法还不错。而不是 HANDLE 你应该使用 HICON.

当没有更多内容引用该图标句柄时,您确实需要销毁它。打电话给 DestroyIcon 这样做。

图标的生命周期与它的有效句柄 (HICON) 存在一样长,否则,它会在进程退出时被清除。

通常您会希望将功能包装在某种具有适当复制和移动语义的 Icon class 中。或者至少将其绑定到 RAII class 以管理 HICON.

的生命周期

考虑到这里使用它的单例性质,这可能有点矫枉过正。让单例在程序退出的时候清理一下DestroyIcon。这里需要注意的是,您真的应该确保代码的客户不会尝试为您清理它。一旦他们有了一点副本,当然,你几乎无法阻止他们,但至少在文档中要清楚代码的行为方式和一些原因(因为这似乎是一个极端情况 w.r.t.资源管理).

旁注:我相信复制图标的正确功能是 CopyIcon