【问题标题】:Determine the current HINSTANCE?确定当前的 HISTANCE?
【发布时间】:2010-12-17 12:34:25
【问题描述】:

win32 应用程序的 HINSTANCE 被传递给 WinMain,但是有没有其他方法可以确定当前的 HINSTANCE(如果你不知道,我对 win32 编程很陌生!)?我需要在库中创建一个窗口,并且(因为库是跨平台的),id 不希望将其传入。

【问题讨论】:

  • 值得一提:您实际上并不需要实例句柄来创建窗口。注册课程时只需输入hInstance = NULL 并将NULL 传递给CreateWindow() 即可。

标签: winapi hinstance


【解决方案1】:

如果您使用的是 MFC,则可以使用 AfxGetInstanceHandle。

如果你不使用 MFC,你可以使用:GetWindowLong(hWnd, GWL_HINSTANCE)

【讨论】:

  • 假设我已经有一个窗口(因此还有 hwnd)...我正在尝试将创建窗口的工作推到我的库中...
  • 请查看此链接,我想您可能会遇到 Raymond 所说的问题:blogs.msdn.com/oldnewthing/archive/2005/04/18/409205.aspx
  • AfxGetInstanceHandle 和 GetWindowLong 都返回应用程序的 HINSTANCE,但您可以在不创建窗口的情况下调用 AfxGetInstanceHandle。
  • 如果你真的想也可以设置一个全局变量并将其extern in。
  • GetWindowLong() 版本假定为 32 位平台构建。但是在 Win64 上,你会遇到麻烦。
【解决方案2】:

如果内存可用,GetModuleHandle(NULL); 返回实例句柄。

【讨论】:

  • 不完全正确:它返回了 exe 的 HINSTANCE。如果代码在 DLL 中执行,这可能会导致错误的行为
  • @Serge:按照他的说法,可执行文件的 HINSTANCE 正是他想要的。
  • +1:通过传入模块名称,该函数也可用于获取 DLL 的HINSTANCE。请注意,HINSTANCEHMODULE 在现代版本的 Windows 中基本上是等效的。
  • Adrian,库中的代码如何知道它位于哪个模块(exe/dll)中?
【解决方案3】:

__ImageBase 是你的朋友,尤其是图书馆。

请注意,链接的博客文章(R. Chen,虽然与 Brian Bondy 链接的文章不同)值得一读(包括 cmets!)

【讨论】:

  • 忽略繁琐的GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,这确实是唯一可靠的查找模块句柄的方法,应该是公认的答案。
【解决方案4】:

函数 AfxGetStaticModuleState() 可以解决问题。 如果在 dll 中调用,函数会返回 dll 的句柄,如果在 exe 中调用,则返回可执行文件的句柄。

DWORD size;
TCHAR fileName [MAX_PATH];
HMODULE hModule = AfxGetStaticModuleState()->m_hCurrentInstanceHandle;
::GetModuleFileName (hModule, fileName, size);

【讨论】:

  • 问题被标记为 winapi。 Windows API 中没有AfxGetStaticModuleState
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2023-04-03
  • 1970-01-01
  • 2010-12-23
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多