아하 로고
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
느긋한쇠오리233
느긋한쇠오리23319.06.10
exe 확장자 프로그램 종료 관련 문의드립니다

ShellExecute를 이용해서 특정 디렉토리나, exe 파일을 실행할 수 있습니다.

반대로 exe파일을 종료할 수 있을까요?

kill()을 사용해서 프로세스를 죽이는 경우에는 PID를 사용하는데 해당 exe 파일의 PID를 구분하는 방법을 모르겠습니다. 특정 exe파일의 이름을 가지고 PID를 구분하는 방법이나 exe 프로그램을 kill할 수 있는 API가 있는지 궁금합니다.

  • prompt 명령어를 C에서 사용하려면 system함수를 사용해야 하지만, 일반적으로 검은색 콘솔창이 추가로 생성합니다. 따라서 API를 이용하게 되는데 두 가지 방법을 생각해볼 수 있습니다.

    정상적으로 종료를 할 필요가 있다면 해당 프로그램의 윈도우 핸들을 구해서 WM_CLOSE메시지를 보내면 됩니다.(모달 대화상자를 띄워 저장하겠냐고 묻는 프로그램이 많이 있으므로 SendMessage보다는 PostMessage를 권장.)

    다른 방법으로, 작업 관리자에서 프로세스 끝내기를 했을 때 사용하는 함수를 사용하는 방법입니다.

    TerminateProcess라는 함수를 사용해야 하는데, 이 함수의 첫 번째 인수에 프로세스 핸들을 전달해야 합니다. 해당 프로그램의 hWnd를 이용해 프로세스 핸들을 구하려면 OpenProcess함수를 사용해야 합니다.

    다만 OpenProcess 함수는 pid를 필요로 하므로 pid역시 구해야 합니다.

    hWnd로 pid를 구하려면 GetWindowThreadProcessId 함수를 사용하면 됩니다.


  • 질문하신 내용은 OS나 언어를 무엇을 사용하느냐에 따라서 많이 달라질것같습니다.

    리눅스의 경우 아래 방법으로 가능합니다.

    https://dreamlog.tistory.com/299

    추가적으로 다른 프로세스가 필요한게아니라 특정 exe파일의 kill만 필요하신거라면

    오토핫키 등을 사용하시면 원하시는 특정 이름의 exe를 종료하거나,

    pid를 찾아서 종료하거나 ( 이름으로 pid 찾기도 가능) 하는 등에 작업을

    정말 간단하고 빠르게 구현할수있게됩니다.

    https://elderlykims.tistory.com/37

    참조하시면

    IfWinExist, 프로그램명

    IfWinNotExist, 프로그램명

    두가지로 프로그램의 존재여부를 파악후에

    WinClose, 프로그램

    이라는 명령어로 해당 프로세스를 이름만으로 종료할수있습니다.


  • 탈퇴한 사용자
    탈퇴한 사용자19.06.11
    #include <cstdio> #include <windows.h> #include <tlhelp32.h> int main( int, char *[] ) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); BOOL bOk = TerminateProcess(hProcess, 0); CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }

    이렇게 한 번 해보세요~