Winapi 确定当前状态?
win32应用程序的HINSTANCE会传递给WinMain,但是是否有其他方法来确定当前HINSTANCE(如果您不知道,我对win32编程非常陌生!)?我需要在库的内部创建一个窗口,并且(因为库是跨平台的),我不希望将它传入。如果您使用的是MFC,那么可以使用AfxGetInstanceHandleWinapi 确定当前状态?,winapi,hinstance,Winapi,Hinstance,win32应用程序的HINSTANCE会传递给WinMain,但是是否有其他方法来确定当前HINSTANCE(如果您不知道,我对win32编程非常陌生!)?我需要在库的内部创建一个窗口,并且(因为库是跨平台的),我不希望将它传入。如果您使用的是MFC,那么可以使用AfxGetInstanceHandle 如果不使用MFC,则可以使用:GetWindowLong(hWnd,GWL\u HINSTANCE)如果内存可用,GetModuleHandle(NULL)返回实例句柄。是您的朋友,尤其是在库的
如果不使用MFC,则可以使用:GetWindowLong(hWnd,GWL\u HINSTANCE)如果内存可用,
GetModuleHandle(NULL)
返回实例句柄。是您的朋友,尤其是在库的情况下
请注意,链接的博文(由R.Chen撰写,尽管与Brian Bondy撰写的博文不同)值得一读(包括评论!)函数afxGetStaticModuleEstate()起作用。 如果在dll中调用,函数将返回dll的句柄;如果在exe中调用,函数将返回可执行文件的句柄
DWORD size;
TCHAR fileName [MAX_PATH];
HMODULE hModule = AfxGetStaticModuleState()->m_hCurrentInstanceHandle;
::GetModuleFileName (hModule, fileName, size);
假设我已经有了一个窗口(因此,还有hwnd)。。。我正在尝试将窗口创建工作推到我的库中…请查看此链接,我认为您可能会遇到Raymond所说的问题:AfxGetInstanceHandle和GetWindowLong都返回应用程序的状态,但是,您可以在不创建窗口的情况下调用AfxGetInstanceHandle。如果确实需要,您也可以设置一个全局变量,并将其外部化。
GetWindowLong()
版本采用32位平台构建。但在Win64上,您会遇到麻烦。这并不完全正确:它会重新显示exe的状态。如果代码在DLL中执行,这可能会导致错误behaviours@Serge:从他所说的,可执行文件的HINSTANCE正是他想要的。+1:通过传入模块名,该函数也可以用于获取DLL的HINSTANCE
。请注意,HINSTANCE
和HMODULE
在现代版本的Windows中本质上是等效的。Adrian,库中的代码如何知道它位于哪个模块(exe/dll)中?问题被标记为winapi。Windows API中没有AFXGetStaticModuleEstate
。忽略GET\u MODULE\u HANDLE\u EX\u FLAG\u FROM\u ADDRESS
,这是找到模块句柄的唯一可靠方法,应该是公认的答案。值得一提的是:创建窗口实际上不需要实例句柄。注册类时只需将hInstance=NULL
设置为,并将NULL
传递给CreateWindow()
即可。