제가만든 프로그램에서는 특정 어플리케이션을 실행시킨후 종료시키는 루틴이
있습니다. 두개의 프로그램으로 나누어져 있는데, 첫번째 프로그램에서는
프로그램을 실행시킨후에, 실행시킨 프로그램의 process ID를 매모리맵드화일에
기록을 합니다. 두번째 프로그램에서는 매모리맵드화일에 기록되어 있는, process ID
를 읽어서 종료시키는 처리를 합니다.
하지만, 원하는대로 동작하지 않는군요.
이문제를 해결할 방법을 알고계신 고수분이 계시면 도움을 부탁드립니다.
다음은 프로그램의 소스입니다.
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 WriteData(log_handle : thandle);
var
FileMapObj : THandle;
IntP : PInteger;
begin
FileMapObj := CreateFileMapping( $FFFFFFFF,
nil,
PAGE_READWRITE ,
0,
SizeOf(Integer),
'Get_ProcessID'
);
IntP := MapViewOfFile(FileMapObj, FILE_MAP_WRITE, 0, 0, 0);
try
IntP^ := thandle;
finally
UnMapViewOfFile(IntP);
end;
CloseHandle(FileMapObj);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
log_handle : thandle;
begin
// 프로그램을 실행시키고 Process ID를 가져온다.
log_handle := sjExcuteApp('C:hnchvw.exe');
// 메모리맵드화일에 실행시킨 프로그램의 Process ID를 기록
WriteData(log_handle);
end;
Project2.exe
============
//-------------------------------------------------------
// 메모리맵드화일에 기록된 응용프로그램의 process id를 읽어온다.
//-------------------------------------------------------
procedure ReadData(var log_handle : thandle);
var
FileMapObj : THandle;
IntP : PInteger;
begin
FileMapObj := CreateFileMapping( $FFFFFFFF,
nil,
PAGE_READWRITE ,
0,
SizeOf(Integer),
'Get_ProcessID'
);
IntP := MapViewOfFile(FileMapObj, FILE_MAP_WRITE, 0, 0, 0);
try
log_handle := log_handle;
finally
UnMapViewOfFile(IntP);
end;
CloseHandle(FileMapObj);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
log_handle : thandle;
begin
log_handle := 0;
// 메모리맵드화일에tj 실행시킨 프로그램의 Process ID를 가져온다.
ReadData(log_handle);
// 실행시킨 프로그램을 종료시킨다.
terminateprocess(log_handle,0);
end;