뷰파인더 님이 쓰신 글 :
: 안녕하세요.
:
: 제목처럼 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 입니다.
https://github.com/TurboPack/DOSCommand 참고하시면 도움이 되실겁니다