|
정재만 님이 쓰신 글 :
: cmd.exe를 실행시켜 도스창을 띄운다음 도스창에서 윈도우 프로그램을 실행시킵니다.
:
: 그런다음 윈도우 프로그램에서 자신을 실행시킨 그콘솔(cmd.exe)로 메세지를 출력하는 문제인데
:
: 파이프등을 이용해도 쉽게 풀리지 않네요....
:
: 다른방식의 접근이 필요한것 같은데 ......
:
: 고수님들의 의견을 듣고 싶네요....
냠냠 몇년전의 소스에서 뒤져보니 있네요
ㅎㅎ 오랜만에 답변다넹 =ㅅ=ㅋ
ㅎㅎ 그리고 아는게 없네요 여러분 죄송;;
아래는 코드입니다 당연히 물대주는 파이프 썼구요
뭐 핵심 메소드 한개면 이해하실거라 믿습니다 =ㅅ=;;
bool __fastcall TSynapse::ExecuteCommand(String Command, String WorkDir)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
HANDLE hReadPipe, hWritePipe;
bool flag;
//create pipe handles
flag = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
if ( flag && ( ( hReadPipe == INVALID_HANDLE_VALUE) || ( hWritePipe == INVALID_HANDLE_VALUE ) ) )
{
return false ;
}
STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof (STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
if ( !CreateProcess(NULL, Command.c_str(), &sa, &sa, true, 0, NULL, WorkDir.c_str(), &si, &pi) )
{
CloseHandle(hReadPipe);
return false ;
}
CloseHandle(hWritePipe); // 핸들을 닫지않을 경우 프로세스가 블록된다.
char buffer[512];
DWORD BytesRead;
String Result = "";
Output->Clear() ;
while ( ReadFile(hReadPipe, &buffer, sizeof(buffer) - 1, &BytesRead, NULL) && BytesRead )
{
buffer[BytesRead] = '\0';
Result = Result + buffer;
Application->ProcessMessages();
}
CloseHandle(hReadPipe);
Output->Text = Result;
return true;
}
|