2011-07-09 414 views
1

如何从文件名获得进程ID? 像:int processId = getProcessIdByFileName("Network.dll"); 顺便说一句,它的数据类型具有进程ID?C++如何从DLL(windows)的文件名获得进程ID?

扩展信息: 我有一个DLL的源代码。这个DLL被加载到应用程序中,就像其他一些DLL一样。我想钩住其他DLL的功能。因此,我需要它们的进程ID(是否有每个DLL的进程ID,如果它们都在一个应用程序下运行?

我怎样才能调用其他DLL的函数在我的DLL里面?如何获得它们的句柄?

+0

“他们都在一个应用程序中运行”?一个应用程序是一个进程。因此,整个应用程序的一个进程id,它不是每个加载的lib或其他东西。除非是应用程序,否则使用IPC? –

+0

可能有很多进程ID。每个加载DLL的进程都会有一个。你可能意味着模块句柄而不是进程ID? –

+2

很确定你不需要进程ID,你可以用它做任何事情。也许模块处理,使用GetModuleHandle()。但你可能真的想要Microsoft Detours,假设“挂钩”是准确的。 –

回答

0

这是不可能的,原因如下:DLL在进程之间共享,它可能只有一个“拥有”进程,它可能有很多,你可以确定程序已经加载了哪些dll(例如,依赖walker)但是不能确定哪些程序(如果有的话)连接到一个DLL。

+0

但是,如何从我自己的DLL中钩住一个DLL,其中两个都加载到一个应用程序。我想为所有加载到应用程序和应用程序本身的DLL应用钩子。 – lolo

+0

@lolo:什么? –

+0

我有一个DLL的源代码。这个DLL被加载到应用程序中,就像其他一些DLL一样。我想钩住其他DLL的功能。我想应用钩子 - 每个DLL和应用程序都应该调用钩子函数而不是原来的! :) – lolo

3

的DLL没有进程ID。一个DLL可以被装载到多个进程,或根本没有。一个DLL可以被加载到一个过程,稍后卸载,然后loade再次。谈论DLL的进程ID是毫无意义的。你究竟在做什么?在Windows

+0

我尝试从我自己的DLL中钩住一个DLL,其中两个都加载到一个应用程序。我想为所有加载到应用程序和应用程序本身的DLL应用钩子。 – lolo

0

进程ID没有被staticaly嵌入内部文件,其任何DLL,EXE或可执行具有一次它的运行属性。检查Toolhelp API,你会发现所有的答案。

要调用其他DLL需要加载的DLL dynamicaly功能,检查这里的一个例子http://www.codeproject.com/KB/DLL/dynamicdllloading.aspx

+0

我想通过查找进程名称的文件名并查找进程名称来加载DLL。 – lolo

0

DLL文件无法运行,它们是由进程加载,所以这是不可能的。但是,您可以通过使用其路径或名称来查找进程的PID。获得“explorer.exe的”

的PID你可以得到已加载特定DLL进程的PID的。即。

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,只有一个进程。

相关问题