Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 确定当前状态?_Winapi_Hinstance - Fatal编程技术网

Winapi 确定当前状态?

Winapi 确定当前状态?,winapi,hinstance,Winapi,Hinstance,win32应用程序的HINSTANCE会传递给WinMain,但是是否有其他方法来确定当前HINSTANCE(如果您不知道,我对win32编程非常陌生!)?我需要在库的内部创建一个窗口,并且(因为库是跨平台的),我不希望将它传入。如果您使用的是MFC,那么可以使用AfxGetInstanceHandle 如果不使用MFC,则可以使用:GetWindowLong(hWnd,GWL\u HINSTANCE)如果内存可用,GetModuleHandle(NULL)返回实例句柄。是您的朋友,尤其是在库的

win32应用程序的HINSTANCE会传递给WinMain,但是是否有其他方法来确定当前HINSTANCE(如果您不知道,我对win32编程非常陌生!)?我需要在库的内部创建一个窗口,并且(因为库是跨平台的),我不希望将它传入。

如果您使用的是MFC,那么可以使用AfxGetInstanceHandle


如果不使用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()
即可。