Q&A

  • 실행시킨 프로그램을 죽이는 방법 ????


제가만든 프로그램에서는 특정 어플리케이션을 실행시킨후 종료시키는 루틴이

있습니다. 두개의 프로그램으로 나누어져 있는데, 첫번째 프로그램에서는

프로그램을 실행시킨후에, 실행시킨 프로그램의 process ID를 로그화일에

기록을 합니다. 두번째 프로그램에서는 로그화일에 기록되어 있는, process ID

를 읽어서 죽이는 처리를 합니다.



하지만, 실행시킨 프로그램이 종료되지 않는군요. 단. 실행시킨 프로그램의

로그를 기록하는 루틴과, 기록된 로그를 읽어서 해당 process ID를 죽이는

루틴이 하나의 프로그램에 있으면 잘 작동합니다, 그러나 두개의 모듈을

2개의 프로그램으로 나누어 실행시키면 해당 프로세스를 죽이지 못합니다.



이문제를 해결할 방법을 알고계신 고수분이 계시면 도움을 부탁드립니다.



다음은 프로그램의 소스입니다.



Project1.exe

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



//-------------------------------------------------

// 응용프로그램을 실행

//-------------------------------------------------

function sjExcuteApp(const app_name: String): Integer;

var

StartInfo : TStartupInfo;

ProcInfo : TProcessInformation;

run_ok : boolean;

exe_name : array[0..255] of char;

begin

FillChar( StartInfo, SizeOf(TStartupInfo), #0 );

FillChar( ProcInfo, SizeOf(TProcessInformation), #0 );

StartInfo.cb := SizeOf(TStartupInfo);



strpcopy(exe_name, app_name);



run_ok := CreateProcess( nil,

exe_name,

nil,

nil,

False,

CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS,

nil,

nil,

StartInfo,

ProcInfo );



if run_ok then

Result := ProcInfo.hProcess

else

Result := 0;

end;



//-------------------------------------------------

// 실행시킨 응용프로그램의 process id를 화일에 기록

//-------------------------------------------------

procedure WriteLog(log_handle : thandle);

VAR

F : TFileStream;

begin

F := TFileStream.Create('c:tempAppLog.log',fmCreate);



try

F.Write(log_handle, sizeof(log_handle));

finally

F.Free;

end;

end;





procedure TForm1.Button1Click(Sender: TObject);

var

log_handle : thandle;

begin

log_handle := sjExcuteApp('C:hnchvw.exe');

WriteLog(log_handle);

end;







Project2.exe

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



//-------------------------------------------------------

// 로그화일일 기록된 응용프로그램의 process id를 읽어온다.

//-------------------------------------------------------

procedure ReadLog(var log_handle : thandle);

var

F : TFileStream;

begin

F := TFileStream.Create('c:tempAppLog.log',fmOpenRead);



try

F.Read(log_handle, sizeof(log_handle));

finally

F.Free;

end;

end;



procedure TForm1.Button1Click(Sender: TObject);

var

log_handle : thandle;

begin

log_handle := 0;



ReadLog(log_handle);



terminateprocess(log_handle,0);

end;



0  COMMENTS