【发布时间】:2011-06-09 00:51:33
【问题描述】:
我需要根据加载它的进程在 dll 中做一些事情。因此,对于 Windows 编程来说相对较新,我需要帮助找出如何找到加载当前 dll 的 exe。到目前为止,我一直在硬编码 exe 文件名,这是最愚蠢的事情:D
1) 有人建议使用GetModuleFileName() 函数。但这似乎使我的应用程序崩溃。(我使用 0 作为模块句柄)。我没有做任何花哨的事情。我使用了以下语法
GetModuleFileName(0,&fileName,MAX_PATH)
编辑:我从here 了解到,我无法通过此调用获取 .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);
我做错了什么??
谢谢
编辑重要提示:
我发现我正在尝试在空闲进程上使用 openprocess。(即)我忘记了我的父进程可能正在等待我,因为我同步了它。所以现在我得到一个坏消息,我无法使用 OpenProcess 打开空闲进程。 我还能如何查看空闲进程的对象??(我确定它是空闲的,因为我在快照中找不到它。我不得不使用 enumerateprocess 来定位它的 ID;但是我确实使用快照中的正常进程枚举来首先找到父进程ID)
【问题讨论】:
-
“空闲进程”是什么意思?如果您的意思是 空闲进程(Windows 将未使用的 CPU 时间归因于该进程),那么这预计会失败 - 这不是一个真正的进程。
标签: c++ exe parent getmodulefilename