Jak napisać Front-End ?
Front End” to nakładka (interfejs graficzny) na istniejący już program dos’owy (konsolowy). Pod linux’em „Front End’ty” stanowią trzon programów graficznych (z tego powodu, gdyż większość programów to aplikacje konsolowe – począwszy od aplikacji konfiguracyjnych, po programy użytkowe), pod windowsem z „Front End’em” można się spotkać przede wszystkim w środowiskach programistycznych (okienko postępu kompilacji, wyświetlenie błędów, status kompilacji – RadASM, Dev-Cpp itp.).




Inną okazją (tą powszechną) spotkania się „Front End’em” to nakładki na programu konsolowe. Przykładem takiej nakładki jest program dosowy upx.exe (http://upx.sourceforge.net/) i jeden z jego windowsowych „Front End’ów” GUiPeX (http://www.blueorbsoft.com/guipex/ )




Zaletami „Front End’ta” to między innymi:

- Miłe dla oka okienko programu windowsowego (Rysunek 4)
- Brak konieczności przekazywania długich nazw konsolowych (Rysunek 3)
- Brak konieczności zaznajomienia się ze wszystkimi opcjami programu.

Jak już wiemy co to jest „Front End” i gdzie można to znaleźć, pora napisać własny. Może zanim zaczniemy pisać własne środowisko programistyczne zacznijmy od czegoś prostszego.
Na przykład wywołajmy polecenie ipconfig i podświetlmy ważne informacje karty sieciowej jak bramka, numer ip czy maska podsieci.

1) Tworzymy sobie nowy projekt (uruchamiamy C++Buildera)
2) Umieszczamy na formie RichEdita
3) Zmieniamy własności RichEdita (tło: czarne, kolor: żółty, tekst wyboldowany)
4) W Zdarzeniu TForm1::FormCreate umieszczamy

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  SECURITY_ATTRIBUTES sat;
  STARTUPINFO startupinfo;
  PROCESS_INFORMATION pinfo;
  HANDLE hRead;
  HANDLE hWrite;
  char buffer[1024];
  DWORD bytesRead;
 
  //Tworzenie potoku...
  sat.nLength  = sizeof(SECURITY_ATTRIBUTES);
  sat.lpSecurityDescriptorNULL;
  sat.bInheritHandle = TRUE;
  CreatePipe((PHANDLE)&hRead, (PHANDLE)&hWrite, &sat, NULL);
 
  startupinfo.cb = sizeof(STARTUPINFO);
  GetStartupInfo(&startupinfo);
 
  startupinfo.hStdOutput  = (PHANDLE)hWrite;
  startupinfo.hStdError  = (PHANDLE)hWrite;
  startupinfo.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  startupinfo.wShowWindow = SW_HIDE;
 
  //Uruchamianie procesu...
  CreateProcess(NULL, "ipconfig", NULL, NULL, TRUE, NULL,
                          NULL, NULL, &startupinfo, &pinfo);
 
  //Zapisanie wyniku do RichEdita
  RtlZeroMemory(buffer, 1024);
  ReadFile(hRead, buffer, 1023, &bytesRead, NULL);
  RichEdit1->Lines->Add( buffer );
 
  //Zamkniecie potoku i uchwytow do procesu
  CloseHandle(hRead);
  CloseHandle(pinfo.hProcess);
  CloseHandle(pinfo.hThread);
 
  //Kolorowanie ipkow i nie tylko
  int pos=1, pos2=-1;
  while(1)
  {
  pos  = RichEdit1->FindTextA(":", pos,
  RichEdit1->Lines->Text.Length(),TSearchTypes()<< stMatchCase);
  if (pos == -1) break;
  pos2 = RichEdit1->FindTextA("\n", pos+1,
  RichEdit1->Lines->Text.Length(),TSearchTypes()<< stMatchCase);
  if (pos2 == -1) break;
  RichEdit1->SelStart = pos+1;
  RichEdit1->SelLength = pos2 - pos - 1;
  RichEdit1->SelAttributes->Color = clRed;
  pos = pos2+1;
  }
  RichEdit1->SelStart = 0;
}


5) Kompilujemy i cieszymy się działającym programem...



...dla porównania kliknijmy sobie na START->URUCHOM->cmd [ENTER]->ipconfig



Autorem tekstu jest: Wojciech Bojewski
Materiał dodany przez użytkownika: _hador_