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
5) Kompilujemy i cieszymy się działającym programem...

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



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.lpSecurityDescriptor = NULL;
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;
}
{
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.lpSecurityDescriptor = NULL;
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_
