제가만든 프로그램에서는 특정 어플리케이션을 실행시킨후 종료시키는 루틴이
있습니다. 두개의 프로그램으로 나누어져 있는데, 첫번째 프로그램에서는
프로그램을 실행시킨후에, 실행시킨 프로그램의 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;