如何从dll内部查找dll的父exe?

ash*_*ash 6 c++ exe parent getmodulefilename

我需要根据已加载的进程在dll中做一些事情。因此,相对于Windows编程而言,我还是比较陌生的,我需要帮助弄清楚如何找到加载当前dll的exe。到目前为止,我一直在对exe文件名进行硬编码,这是最愚蠢的事情:D

1)有人建议使用GetModuleFileName()功能。但这似乎使我的应用程序崩溃了(我使用0作为模块句柄)。我什么也没做。我使用以下语法

GetModuleFileName(0,&fileName,MAX_PATH)

编辑:我从这里了解到,我无法通过此调用获取.exe名称,因为它仅返回dll名称:(

2)在DllMain中这样做是个好主意吗?我知道DllMain并不是处理复杂事物的地方。我也了解与加载程序锁相关的问题。我所需要的只是查找父进程的名称。

感谢您的宝贵时间!

添加:我尝试在获取父进程ID后使用GetProcessImageFileName。我收到访问冲突错误。当我尝试调试时,我注意到openProcess调用将我的结果参数(图像文件路径-LPTSTR)留为错误的指针。
GetProcessImageFileName调用返回错误代码87-INVALID PARAMETER。
但是当前的进程ID是有效ID。
这是代码

LPTSTR fileName={0};  
HANDLE hP=OpenProcess(PROCESS_QUERY_INFORMATION ,FALSE, processes[i]) ;
GetProcessImageFileName(hP,fileName,(DWORD)MAX_PATH+1);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么??

谢谢

编辑要点:

我发现我正在尝试在空闲进程上使用openprocess。(ie)我忘记了我的父进程可能因为我同步而可能正在等待我。因此,现在我得到了一个坏消息,即我无法使用OpenProcess打开一个空闲进程。我还能如何查看空闲进程的对象?(我肯定知道它是空闲的,因为我无法在快照中找到它。我不得不使用enumerateprocess来找到它的ID;但是我确实使用快照中的普通进程枚举来首先找到父进程ID)

Ric*_*der 0

我假设您正在使用 C 进行编码。您很可能没有为文件名分配 MAX_PATH + 1 个字符。