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
。
我正在编写一个小型 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
。