急!!!!请各位大虾指点如何通过 DllMain 中 hModule获得加载DLL的进程的窗口信息或者进程对应的exe文件的信息

时间:2021-08-23 14:43:24
我如何获得加载DLL的进程的一些信息,如下
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved )
这里只有hModule,如何通过hModule获得,进程对应的主窗体的句柄或者进程对应的exe文件

5 个解决方案

#1


TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL, pszLoader, MAX_PATH);
可以获得当前加载dll的进程的exe文件的路径及文件名,主窗体就更简单了吧

#2


GetModuleFileName可以获得加载进程exe文件路径

#3


我的意思是在DLL中如何获得,加载该DLL的进程的句柄或者ID,以及进程的主窗口

#4


GetModuleHandle(LPCTSTR lpModuleName)

lpModuleName is the Module File name,
If this parameter is NULL, GetModuleHandle returnes a handle to the file used to create  the calling process.

有了句柄,你想做什么,就做 什么吧.

这个函数在EXE或者DLL中调用效果一样,都是取进程,而不是当前的模块, (GetModuleFileName函数也类似这样).

使用NULL参数就行了.相反你想获得当前模块的句柄是没这么简单的事!你必须将你的模块的文件名作为参数传进去.  一楼二楼都是正解.

#5


GetModuleFileName Used For DLL


GetModuleFileName is the function you want; it gets the name of a module—DLL or EXE. GetModuleFileName takes an HINSTANCE and a buffer in which to put the name. You can call GetModuleFileName with a NULL instance handle, but then it returns the name of the running process (EXE), not the DLL. To get the name of the DLL, you need its instance handle.
If you're using MFC, you can get the instance handle from AfxGetApp()->m_hInstance. AfxGetApp returns a pointer to the current global application object (DLL object in the case of a DLL); m_hInstance is the instance handle.

char buf[MAXLEN];
::GetModuleFileName(AfxGetApp()->m_hInstance, buf, sizeof(buf);

If you're not using MFC, you'll have to save the HINSTANCE yourself somewhere as a global, in DllMain, when your DLL first starts up.

// module instance handle—global variable
HINSTANCE g_hInstance;
BOOL DllMain(HINSTANCE hinst, DWORD dwReason, ...)
{
  if (dwReason == DLL_PROCESS_ATTACH) {
    g_hInstance = hinst; // save it
    ...
  } else if (dwReason == DLL_PROCESS_DETACH) {
    g_hInstance = NULL; // good idea
    ...
  }
}

#1


TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL, pszLoader, MAX_PATH);
可以获得当前加载dll的进程的exe文件的路径及文件名,主窗体就更简单了吧

#2


GetModuleFileName可以获得加载进程exe文件路径

#3


我的意思是在DLL中如何获得,加载该DLL的进程的句柄或者ID,以及进程的主窗口

#4


GetModuleHandle(LPCTSTR lpModuleName)

lpModuleName is the Module File name,
If this parameter is NULL, GetModuleHandle returnes a handle to the file used to create  the calling process.

有了句柄,你想做什么,就做 什么吧.

这个函数在EXE或者DLL中调用效果一样,都是取进程,而不是当前的模块, (GetModuleFileName函数也类似这样).

使用NULL参数就行了.相反你想获得当前模块的句柄是没这么简单的事!你必须将你的模块的文件名作为参数传进去.  一楼二楼都是正解.

#5


GetModuleFileName Used For DLL


GetModuleFileName is the function you want; it gets the name of a module—DLL or EXE. GetModuleFileName takes an HINSTANCE and a buffer in which to put the name. You can call GetModuleFileName with a NULL instance handle, but then it returns the name of the running process (EXE), not the DLL. To get the name of the DLL, you need its instance handle.
If you're using MFC, you can get the instance handle from AfxGetApp()->m_hInstance. AfxGetApp returns a pointer to the current global application object (DLL object in the case of a DLL); m_hInstance is the instance handle.

char buf[MAXLEN];
::GetModuleFileName(AfxGetApp()->m_hInstance, buf, sizeof(buf);

If you're not using MFC, you'll have to save the HINSTANCE yourself somewhere as a global, in DllMain, when your DLL first starts up.

// module instance handle—global variable
HINSTANCE g_hInstance;
BOOL DllMain(HINSTANCE hinst, DWORD dwReason, ...)
{
  if (dwReason == DLL_PROCESS_ATTACH) {
    g_hInstance = hinst; // save it
    ...
  } else if (dwReason == DLL_PROCESS_DETACH) {
    g_hInstance = NULL; // good idea
    ...
  }
}