2011-07-09 70 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,只有一個進程。