Я пытаюсь получить дескриптор файла любого работающего процесса в 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
) часть?
Или я что-то еще не так делаю?
Использование CloseHandle
здесь совершенно правильно, это просто предположение о том, что он на самом деле делает, что это неправильно. Закрывает ручку, только что открытую OpenProcess
и никоим образом не поможет изменить (удалить или переименовать) исполняемый файл, поскольку этот файл остается открытым в операционной системе. ОС сохраняет файл открытым, потому что исполняемые файлы (и DLL) «загружаются по требованию», а это означает, что ОС загружает не весь исполняемый файл одновременно, а только то, что ей действительно нужно на данный момент. Позже, когда необходим код, который ранее не запускался, он загружает эти биты.
Других решений пока нет …