2013-07-30 2 views
4

Я пытаюсь получить дескриптор файла любого запущенного процесса на C++. Это мой код:Как получить дескриптор файла процесса?

#include <windows.h> 
#include <process.h> 
#include <Tlhelp32.h> 
#include <winbase.h> 
#include <string.h> 
void killProcessByName(const char *filename) 
{ 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); 
    PROCESSENTRY32 pEntry; 
    pEntry.dwSize = sizeof (pEntry); 
    BOOL hRes = Process32First(hSnapShot, &pEntry); 
    while (hRes) 
    { 
     if (strcmp(pEntry.szExeFile, filename) == 0) 
     { 
      HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, 
              (DWORD) pEntry.th32ProcessID); 
      if (hProcess != NULL) 
      { 
       CloseHandle(hProcess); 
      } 
     } 
     hRes = Process32Next(hSnapShot, &pEntry); 
    } 
    CloseHandle(hSnapShot); 
} 
int main() 
{ 
    killProcessByName("WINWORD.EXE"); 
    return 0; 
} 

код работает нормально, но требуется ручка не получает освобожден. Есть ли какая-то проблема в сравнении (strcmp) часть? Или есть что-то еще, что я делаю неправильно?

+0

Что значит «ручка не освобождается»? Что означает «выпущенный» в этом контексте. Вы открываете процесс, затем снова закрываете ручку. Это должно освободить дескриптор - какими средствами вы определяете, что что-то не выпущено? Или вы просто ожидаете, что ваш OpenProcess каким-то образом сделает что-то большее, чем даст вам обратную ссылку для этого процесса - например. что он имеет тот же эффект, что и «TerminateProcess (handle)»? –

+0

Отпустив, я обращаюсь к * CloseHandle *. Этот дескриптор не освобождается/закрыт. В моем файле все еще есть активный дескриптор, и я не могу его удалить или переименовать. & yes Я не ожидаю, что Openprocess() сделает что-то вроде: terminateprocess(). Я знаю, что он должен вернуть мне ручку. , но проблема в моей программе errs на strcmp. Почему это так ? – user2518829

+0

«errs at strcmp» означает именно то, что? И «CloseHandle» здесь просто закрывает дескриптор, который вы только что открыли с помощью «OpenProcess», он не позволит вам, например, переименовать файл .exe, который в настоящее время запущен, - ОС держит этот файл открытым до тех пор, пока он не выйдет - нет внешнего манипуляция изменит это. –

ответ

1

Использование здесь CloseHandle здесь совершенно правильно, это просто предположение о том, что на самом деле это неправильно. Он закрывает ручку, только что открытую OpenProcess, и никоим образом не поможет в изменении (удалении или переименовании) исполняемого файла, поскольку этот файл остается открытым внутри ОС. ОС держит файл открытым, потому что исполняемые файлы (и библиотеки DLL) загружаются «спросом», а это означает, что ОС не загружает весь исполняемый файл сразу, он загружает только то, что на самом деле требуется на данный момент. Позже, когда нужен код, который не был запущен раньше, он загружает эти биты.