Q&A

  • 프로그램 실행죽이기.
델파이로 작성된 2개의 프로그램이 있습니다. a.exe 와 b.exe 라고 할때.

a.exe를 실행한 후 b.exe를 winexec 함수를 사용하여 실행을 시켰습니다.

그런데...종료는 어떻게 해야하나요?



어느 팁을 보니까.. 노트패드 죽이는 부분인데요.

NotepadHandle := FindWindow('notepad', nil);

SendMessage(NotepadHandle, wm_Close, 0, 0);



findwindow를 사용해서 handle값을 불러왔더군요.

findwindow를 도움말에서 보니까... className 또는 windowcaption 으로 handle값을 불러오는것 같습니다.

그런데... windowcaption은 사용하기가 어렵고, 어쩔수 없이 classname을 사용해야하는데.... 어떻게 알수 있는지 잘 모르겠습니다. spy프로그램을 사용하면 알수 있다는데...

음... 한번 만들어 설정된 className은 변동이 없는건쥐..이궁.. 모르는게 넘 많네요.

winexec 로 실행시키면 return 값으로 에러체크를 하더군요. 32보다 작으면 에러값더라구요. 음...핸들값은 알수 없는것 같구..

단 shellexe인가? 하는것은 handle값을 return 값으로 넘긴다고 하네요. 그런데

참고로 shellexe 해서 실행시킨후 sendMessage를 사용해서 종료시킬려고 했으나 실패했습니다.

아시는분은 가르쳐 주십시요. 그럼...좀 급합니다. 답변기다리겠습니다.











5  COMMENTS
  • Profile
    남기석 2000.11.10 04:47
    안녕하세요

    청개구리 남기석( http://www.delphitravel.com )입니다.



    SendMessage 말구 PostMessage 를 사용하세요...



    PostMessage( FindWindow( PChar( 'TForm1' ), nil), WM_QUIT, 0, 0 );



    이런식으로요...



    위에보면..

    'TForm1' 이라구 되 있는데요...

    이건 b.exe 프로그램의 메인폼의 Calss 명을 써주시면 됩니다....



    행복하세요...



    ==============================================================================

    임형호 wrote:

    > 델파이로 작성된 2개의 프로그램이 있습니다. a.exe 와 b.exe 라고 할때.

    > a.exe를 실행한 후 b.exe를 winexec 함수를 사용하여 실행을 시켰습니다.

    > 그런데...종료는 어떻게 해야하나요?

    >

    > 어느 팁을 보니까.. 노트패드 죽이는 부분인데요.

    > NotepadHandle := FindWindow('notepad', nil);

    > SendMessage(NotepadHandle, wm_Close, 0, 0);

    >

    > findwindow를 사용해서 handle값을 불러왔더군요.

    > findwindow를 도움말에서 보니까... className 또는 windowcaption 으로 handle값을 불러오는것 같습니다.

    > 그런데... windowcaption은 사용하기가 어렵고, 어쩔수 없이 classname을 사용해야하는데.... 어떻게 알수 있는지 잘 모르겠습니다. spy프로그램을 사용하면 알수 있다는데...

    > 음... 한번 만들어 설정된 className은 변동이 없는건쥐..이궁.. 모르는게 넘 많네요.

    > winexec 로 실행시키면 return 값으로 에러체크를 하더군요. 32보다 작으면 에러값더라구요. 음...핸들값은 알수 없는것 같구..

    > 단 shellexe인가? 하는것은 handle값을 return 값으로 넘긴다고 하네요. 그런데

    > 참고로 shellexe 해서 실행시킨후 sendMessage를 사용해서 종료시킬려고 했으나 실패했습니다.

    > 아시는분은 가르쳐 주십시요. 그럼...좀 급합니다. 답변기다리겠습니다.

    >

    >

    >

    >

    >

  • Profile
    이만준 2000.11.10 03:39


    안녕하세요..



    아래 코드를 이용하세요...



    function IsRun(sFindFile : string): Boolean;

    var peList : TProcessEntry32;

    hL, hP : THandle;

    begin

    Result := False;

    peList.dwSize := SizeOf(TProcessEntry32);

    hL := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if Process32First(hL, peList) then begin

    repeat

    if CompareText(peList.szExeFile, sFindFile) = 0 then begin

    hP := OpenProcess(PROCESS_ALL_ACCESS, TRUE, peList.th32ProcessID);

    TerminateProcess(hP, 0);

    Result := True;

    end;

    until not Process32Next(hL, peList);

    end;

    CloseHandle(hL);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    if IsRun('c:windowsnotepad.exe')

    then ShowMessage('실행중인 메모장을 종료했습니다.')

    else ShowMessage('메모장이 실행 되지 않았네요.');

    end;



    그럼..



    내가 아는 형호님이죠..?

    비베는 어쩌고...









    임형호 wrote:

    > 델파이로 작성된 2개의 프로그램이 있습니다. a.exe 와 b.exe 라고 할때.

    > a.exe를 실행한 후 b.exe를 winexec 함수를 사용하여 실행을 시켰습니다.

    > 그런데...종료는 어떻게 해야하나요?

    >

    > 어느 팁을 보니까.. 노트패드 죽이는 부분인데요.

    > NotepadHandle := FindWindow('notepad', nil);

    > SendMessage(NotepadHandle, wm_Close, 0, 0);

    >

    > findwindow를 사용해서 handle값을 불러왔더군요.

    > findwindow를 도움말에서 보니까... className 또는 windowcaption 으로 handle값을 불러오는것 같습니다.

    > 그런데... windowcaption은 사용하기가 어렵고, 어쩔수 없이 classname을 사용해야하는데.... 어떻게 알수 있는지 잘 모르겠습니다. spy프로그램을 사용하면 알수 있다는데...

    > 음... 한번 만들어 설정된 className은 변동이 없는건쥐..이궁.. 모르는게 넘 많네요.

    > winexec 로 실행시키면 return 값으로 에러체크를 하더군요. 32보다 작으면 에러값더라구요. 음...핸들값은 알수 없는것 같구..

    > 단 shellexe인가? 하는것은 handle값을 return 값으로 넘긴다고 하네요. 그런데

    > 참고로 shellexe 해서 실행시킨후 sendMessage를 사용해서 종료시킬려고 했으나 실패했습니다.

    > 아시는분은 가르쳐 주십시요. 그럼...좀 급합니다. 답변기다리겠습니다.

    >

    >

    >

    >

    >

  • Profile
    임형호 2000.11.10 18:37
    Q&A에서 만나니 느낌이 색다르네요..이만준님...저 델파이하는곳으로 파견나왔습니다.

    후후..



    적어주신 소스를 테스트해볼려고하는데..



    TProcessEntry32; 이것이 정의되지 않았다고 하는데요..

    user절에 무얼 포함해야되는건가요?



  • Profile
    델맹 2000.11.10 03:15
    NotepadHandle := FindWindow('notepad', nil);

    SendMessage(NotepadHandle, wm_Close, 0, 0);



    위처럼 하니까 되던데요. -_-;





    임형호 wrote:

    > 델파이로 작성된 2개의 프로그램이 있습니다. a.exe 와 b.exe 라고 할때.

    > a.exe를 실행한 후 b.exe를 winexec 함수를 사용하여 실행을 시켰습니다.

    > 그런데...종료는 어떻게 해야하나요?

    >

    > 어느 팁을 보니까.. 노트패드 죽이는 부분인데요.

    > NotepadHandle := FindWindow('notepad', nil);

    > SendMessage(NotepadHandle, wm_Close, 0, 0);

    >

    > findwindow를 사용해서 handle값을 불러왔더군요.

    > findwindow를 도움말에서 보니까... className 또는 windowcaption 으로 handle값을 불러오는것 같습니다.

    > 그런데... windowcaption은 사용하기가 어렵고, 어쩔수 없이 classname을 사용해야하는데.... 어떻게 알수 있는지 잘 모르겠습니다. spy프로그램을 사용하면 알수 있다는데...

    > 음... 한번 만들어 설정된 className은 변동이 없는건쥐..이궁.. 모르는게 넘 많네요.

    > winexec 로 실행시키면 return 값으로 에러체크를 하더군요. 32보다 작으면 에러값더라구요. 음...핸들값은 알수 없는것 같구..

    > 단 shellexe인가? 하는것은 handle값을 return 값으로 넘긴다고 하네요. 그런데

    > 참고로 shellexe 해서 실행시킨후 sendMessage를 사용해서 종료시킬려고 했으나 실패했습니다.

    > 아시는분은 가르쳐 주십시요. 그럼...좀 급합니다. 답변기다리겠습니다.

    >

    >

    >

    >

    >

  • Profile
    임형호 2000.11.10 03:20
    이궁..제가 잘못말했네요..

    notepad는 물론...죽습니다.

    그런데..델파이로 만든 실행프로그램을 죽이는거거든요. 그게 잘 안되어서 질문올린겁니다. 죄송합니다....



    델맹 wrote:

    > NotepadHandle := FindWindow('notepad', nil);

    > SendMessage(NotepadHandle, wm_Close, 0, 0);

    >

    > 위처럼 하니까 되던데요. -_-;

    >

    >

    > 임형호 wrote:

    > > 델파이로 작성된 2개의 프로그램이 있습니다. a.exe 와 b.exe 라고 할때.

    > > a.exe를 실행한 후 b.exe를 winexec 함수를 사용하여 실행을 시켰습니다.

    > > 그런데...종료는 어떻게 해야하나요?

    > >

    > > 어느 팁을 보니까.. 노트패드 죽이는 부분인데요.

    > > NotepadHandle := FindWindow('notepad', nil);

    > > SendMessage(NotepadHandle, wm_Close, 0, 0);

    > >

    > > findwindow를 사용해서 handle값을 불러왔더군요.

    > > findwindow를 도움말에서 보니까... className 또는 windowcaption 으로 handle값을 불러오는것 같습니다.

    > > 그런데... windowcaption은 사용하기가 어렵고, 어쩔수 없이 classname을 사용해야하는데.... 어떻게 알수 있는지 잘 모르겠습니다. spy프로그램을 사용하면 알수 있다는데...

    > > 음... 한번 만들어 설정된 className은 변동이 없는건쥐..이궁.. 모르는게 넘 많네요.

    > > winexec 로 실행시키면 return 값으로 에러체크를 하더군요. 32보다 작으면 에러값더라구요. 음...핸들값은 알수 없는것 같구..

    > > 단 shellexe인가? 하는것은 handle값을 return 값으로 넘긴다고 하네요. 그런데

    > > 참고로 shellexe 해서 실행시킨후 sendMessage를 사용해서 종료시킬려고 했으나 실패했습니다.

    > > 아시는분은 가르쳐 주십시요. 그럼...좀 급합니다. 답변기다리겠습니다.

    > >

    > >

    > >

    > >

    > >