c++ - 如何从 dll 内部找到 dll 的父 exe?

标签 c++ exe parent getmodulefilename

我需要根据加载它的进程在 dll 中做一些事情。因此,作为 Windows 编程的新手,我需要帮助弄清楚如何找到加载当前 dll 的 exe。到目前为止,我一直在对 exe 文件名进行硬编码,这是最愚蠢的做法 :D

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

GetModuleFileName(0,&fileName,MAX_PATH)

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

2) 在 DllMain 中执行此操作是个好主意吗??我知道 DllMain 不是做复杂事情的地方。我也了解加载程序锁相关问题。我只需要找到父进程的名称即可。

感谢您的宝贵时间!

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

最佳答案

如果您已将 fileName 变量声明为类似 char fileNamechar fileName[MAX_PATH] 的变量,您可能会收到错误消息,因为您的参数不正确:您使用变量的地址(但是,您没有指定它是编译时错误还是运行时错误,您说它会使您的应用程序崩溃,所以我在这里和 Richard 一起去,您还没有分配您的变量)。

我尝试了以下代码,它既可以在 DLL 中运行(它获取可执行文件的名称,而不是 DLL 模块),也可以在可执行文件本身中运行。
(注意:代码根据下面 Remy 的评论更新,谢谢)

WCHAR exePath[MAX_PATH + 1];
DWORD len = GetModuleFileNameW(NULL, exePath, MAX_PATH);
if (len > 0) {
    wcout 
       << L"Exe path" 
       << (len == MAX_PATH) ? L" (truncated):" : L":" 
       << exePath 
       << endl;
} else {
    wcout 
       << L"Error getting exe path: " 
       << GetLastError() 
       << endl;
}

注意:如果缓冲区不够大,GetModuleFileName将截断结果并返回 nSize

更多关于 handling filenames in Win32 .

关于c++ - 如何从 dll 内部找到 dll 的父 exe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286959/

相关文章:

python - PyQt 和 Py2exe 的系统路径错误

c++ - 是否允许在默认成员初始值设定项中调用非静态成员函数?

c++ - Qt5 和 CMAKE_AUTORCC

c++ - 用 C++ 思考(第 1 卷)Ch-12 Q-21

c++ - 如何运行依赖.dll 文件的Qt 可执行文件?

javascript - Node js中创建多个child_process

Java - 在设置子字段之前在 super 实例化期间调用抽象方法的问题

java - Hibernate HQL查询根据childID获取父+子

c++ - const std::vector<T> 和 std::vector<T> const 有什么区别?

jquery - 父 CSS (jQuery)