Q&A

  • 메모리맵드화일을 이용한 어플리케이션간 데이타 교환?????




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

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

프로그램을 실행시킨후에, 실행시킨 프로그램의 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;



0  COMMENTS