C ++如何从DLL(Windows)的文件名中获取进程ID?
Posted
技术标签:
【中文标题】C ++如何从DLL(Windows)的文件名中获取进程ID?【英文标题】:C++ How to get process ID from filename of DLL(windows)? 【发布时间】:2011-07-09 20:46:57 【问题描述】:如何从文件名中获取进程 ID?
喜欢:int processId = getProcessIdByFileName("Network.dll");
顺便说一句,哪个数据类型有进程 ID?
扩展信息: 我有一个DLL的源代码。该 DLL 与其他一些 DLL 一样被加载到应用程序中。我想挂钩其他 DLL 的函数。因此我需要它们的进程 ID(如果它们都在一个应用程序下运行,是否每个 DLL 都有一个进程 ID?
如何在我的 DLL 中调用其他 DLL 的函数?如何处理它们?
【问题讨论】:
“它们都在一个应用程序下运行”?一个应用程序是一个过程。因此,整个应用程序的一个进程 ID,它不是每个加载的库或其他东西。除非是应用程序,否则使用 IPC? 可能有很多进程 ID。每个加载 DLL 的进程都会有一个。您可能是指模块句柄而不是进程 ID? 很确定您不想要进程 ID,对此您无能为力。也许是模块句柄,使用 GetModuleHandle()。但你可能真的想要 Microsoft Detours,假设“挂钩”是准确的。 COM 是否可以将应用程序的 DLL 作为单独的进程加载?或者是否将组件设计为打包为 EXE 文件? @Steve314,是的,COM 可以在进程外代理服务器进程中加载 DLL。但原则上,这个进程外服务器可以托管多个 DLL。 【参考方案1】:DLL 没有进程 ID。一个 DLL 可以加载到多个进程中,或者根本不加载。 DLL 可以加载到进程中,然后卸载,然后再次加载。谈一个DLL的进程ID是没有意义的。你到底想做什么?
【讨论】:
我尝试从我自己的 DLL 中挂钩一个 DLL,其中两个都加载到一个应用程序中。我想为所有加载到应用程序和应用程序本身的 DLL 应用钩子。【参考方案2】:这是不可能的,原因如下。 DLL 在进程之间共享。它可能只有一个“拥有”进程,也可能有很多。您可以确定某个程序已加载了哪些 dll(例如,dependency walker),但是您无法确定哪些程序(如果有)附加到 DLL。
【讨论】:
但是,我怎样才能从我自己的 DLL 中挂钩一个 DLL,而这两个 DLL 都加载到一个应用程序中。我想为所有加载到应用程序和应用程序本身的 DLL 应用钩子。 我有一个DLL的源代码。该 DLL 与其他一些 DLL 一样被加载到应用程序中。我想挂钩其他 DLL 的函数。我想应用钩子 - 每个 DLL 和应用程序都应该调用钩子函数而不是原来的函数!!!! :) @lolo - 应用挂钩会影响使用相同 DLL 的其他应用程序(或执行任何直接篡改另一个进程的操作)是不受欢迎的。 IIRC,在 16 位 Windows 时代它曾经很容易,但在 Win32 中进行了更改以使其更难。不过,这是仍然可能,可能是通过使用调试器使用的相同 API。但请注意 - 如果您破坏了用户计算机上的其他应用程序,人们不会皱眉头。【参考方案3】:Windows 中的进程 ID 不是静态嵌入在文件中的,它是任何 DLL、EXE 或可执行文件在运行后都具有的属性。检查 Toolhelp API,您会在那里找到所有答案。
要从其他 DLL 调用函数,您需要动态加载该 DLL,请在此处查看示例 http://www.codeproject.com/KB/DLL/dynamicdllloading.aspx
【讨论】:
我想通过在文件名中查找进程名称并通过在进程名称中查找 ID 来加载 DLL。【参考方案4】:DLL 没有运行,它们是由进程加载的,所以这是不可能的。但是,您可以通过使用其路径或名称来查找进程的 PID,即。获取“explorer.exe”的PID
您可以获得已加载特定 DLL 的进程的 PID。 IE。
int PIDs[128];
GetDependentProcesses(PIDs, "Kernel32.dll"); //Custom function, not built in
for(int x = 0; x < 128; x++)
cout << PIDs[x] << " Depends on Kernel32.dll\n";
而且你不能挂钩一个 DLL,只能挂钩一个进程。
【讨论】:
以上是关于C ++如何从DLL(Windows)的文件名中获取进程ID?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?
如何让 PostgreSQL 加载依赖 DLL 的 C 模块?
如何从 c/c++ 源代码获取适用于 Windows 的 python .pyd? (更新:如果你想要的话,现在在 Python 中很活跃)