안녕하세요.
제목처럼 CreateProcess로 콘솔 명령을 실행했을 때 메세지 받는게 문제여서 문의 드립니다.
하고자 하는 작업은 콘솔창의 실행 내용 중 ERROR가 발견되면 message를 표시 하려는데 message를 가져오지 못해 이후 작업을 할수가 없어요.
아래와 같이 콘솔창에 나타납니다.
콘솔창(첨부파일 참조 : console.png) ===============================================
E:\>cd E:\Personal\C_TEST\Jlink
E:\Personal\C_TEST\Jlink>jlink.exe -ExitOnError -CommanderScript update.jlink
SEGGER J-Link Commander V6.88a (Compiled Nov 18 2020 15:10:56)
DLL version V6.88a, compiled Nov 18 2020 15:09:23
J-Link Commander will now exit on Error
J-Link Command File read successfully.
Processing script file...
J-Link connection not established yet but required for command.
Connecting to J-Link via USB...O.K.
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware version: V8.00
S/N: -1
License(s): RDI,FlashDL,FlashBP,JFlash,GDB
VTref=3.338V
Selecting SWD as current target interface.
Selecting 4000 kHz as target interface speed
Target connection not established yet but required for command.
==============================================================================
하지만 Pipe를 이용하여 전달 받은 data는 아래와 같습니다.
Program memo (첨부파일 참조 : Memo1.JPG) =====================================================================
--------------------------------------------------
E:\>cd E:\Personal\C_TEST\Jlink
E:\Personal\C_TEST\Jlink>jlink.exe -ExitOnError -CommanderScript update.jlink
--------------------------------------------------
=====================================================================
code는 아래와 같습니다.
void __fastcall TForm1::StartClick(TObject *Sender)
{
AnsiString strFile;
OpenDialog1->InitialDir = ExtractFilePath(ParamStr(0));
bool flag;
HANDLE hwrite, hread;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
flag = CreatePipe(&hread, &hwrite, &sa, 0);
if (!flag)
{
ShowMessage("Fail to open pipe.");
return;
}
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hwrite;
si.hStdError = hwrite;
PROCESS_INFORMATION pi;
strFile = OpenDialog1->InitialDir + "\\Jlink\\update.bat";
flag = CreateProcess(NULL, strFile.c_str(), NULL, NULL, true, DETACHED_PROCESS,
NULL, NULL, &si, &pi);
if(!flag)
{
ShowMessage("Fail to create process.");
return;
}
CloseHandle(hwrite);
char buffer[512*10];
DWORD BytesRead;
AnsiString ResultString;
bool res = NULL;
do
{
res=::ReadFile(hread,buffer,sizeof(buffer)-1,&BytesRead,0);
if( BytesRead )
{
Memo1->Lines->Add( buffer );
Memo1->Lines->Add( "--------------------------------------------------" );
}
}
while(res);
CloseHandle(hread);
}
Firmware만 하다가 오랜만에 C builder를 하려니 어려워요. C builder는 6.0 입니다.