CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pobieranie wyników działania skryptu *nixowego do Memo1

Pobieranie wyników działania skryptu *nixowego do Memo1

dział ogólny

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » czwartek, 3 lutego 2011, 14:39

Eeee, dobrze.
KOD cpp:     UKRYJ  
("C:\\telnet" + Edit1->Text).c_str()
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 14:50

KOD cpp:     UKRYJ  
WinExec( ("C:\\telnet" + Edit1->Text).c_str(), SW_SHOW);


jak pisałem funkcja WinExec nie jest do tego celu najlepsza, powinieneś używać funkcji CreateProcess. Opis znajdziesz w serwisie Cyfrowy Baron w dziale: porady -> API -> Uruchamianie programu z wybranym do edycji plikiem - sposób trudniejszy.



Kombinuję z wykorzystaniem INDY i ściągnięciem pliku przez ftp na dany komputer.

► patrz serwis: Cyfrowy Baron dział: porady -> sieć - internet -> Ściąganie i wysyłanie plików poprzez protokół FTP.



Ten program powinien wywołać polecenie na danym hoście, zapisać wynik do pliku i ściągnąć go, a następnie zrobić to samo, ale na innym hoście.


Nie rozumiem! Chcesz z komputera lokalnego uruchomić program na serwerze?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 15:49

Cyfrowy Baron napisał(a):jak pisałem funkcja WinExec nie jest do tego celu najlepsza, powinieneś używać funkcji CreateProcess. Opis znajdziesz w serwisie Cyfrowy Baron w dziale: porady -> API -> Uruchamianie programu z wybranym do edycji plikiem - sposób trudniejszy.


Oczywiście widziałem co pisałeś, ale powiem Ci, że udało mi się osiągnąć to co potrzebowałem właśnie z wykorzystaniem WinExec.
Program się loguje pobierając z EditX login i hasło, a następnie sprawdza i zapisuje do pliku to o co go poproszę.

Cyfrowy Baron napisał(a):Nie rozumiem! Chcesz z komputera lokalnego uruchomić program na serwerze?


Jak najbardziej :-) W sumie już zrobiłem.
Teraz ściąganie przez ftp z INDY i odczyt z pliku lokalnego.

@polymorphism
Miałeś oczywiście rację, wszystko śmiga z tymi Editami. Dzięki :-)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 18:25

Zrobiłem co mogłem, większość się udała, poniżej kod:

Kod: Zaznacz cały
WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
Sleep(8000);
WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);
Sleep(2000);
Memo1->Lines->LoadFromFile("C:\\dane1");
DeleteFile("c:\\dane1");


Małe wyjaśnienie ( linijkami ):
1. Połączenie, zalogowanie, odpalenie skryptu, zapisane go pliku - wyjście
2. Czas na wykonanie powyższego
3. Połączenie, zalogowanie, pobranie z ftp - wyjście
4. Czas na wykonanie powyższego
5. Odczytanie pliku z dysku
6. Skasowanie pliku z dysku

Chciałbym pominąć 2 i 4, ale tak, żeby kolejne polecenie czekało na wynik poprzednika. Jak mogę to zrobić wykluczając sleep?

Druga sprawa - zastanawiam się dlaczego poniższy kod do obsługi pkt 5 i 6 nie działa prawidłowo?:
Kod: Zaznacz cały
if (FileExists("C:\\dane1")==true)
        {
        Memo1->Lines->LoadFromFile("C:\\dane1");
        DeleteFile("c:\\dane1");
        }
        else
        {
        Memo1->Lines->Add("Brak dostępu do pliku);
        }


Co dziwne, polecenie nie działa w pętli, gdy wywołuje je osobno działa prawidłowo.

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 19:37

Chciałbym pominąć 2 i 4, ale tak, żeby kolejne polecenie czekało na wynik poprzednika. Jak mogę to zrobić wykluczając sleep?


Można to zrobić właśnie za pomocą funkcji CreateProcess, którą polecałem Tobie już wcześniej zamiast WinExec. ► patrz serwis: Cyfrowy Baron dział: porady -> API -> Uruchomienie aplikacji i oczekiwanie na jej zamknięcie.



Druga sprawa - zastanawiam się dlaczego poniższy kod do obsługi pkt 5 i 6 nie działa prawidłowo?:


Nie działa prawidłowo, czyli jak działa? Określenie nieprawidłowo nic nie mówi o problemie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 19:45

Co do CreateProcess to już się biorę do roboty :-) Jutro dam znać co i jak.
Jeśli chodzi o nieprawidłowe działanie to dotyczy ono braku wyświetlanego komentarza w oknie Memo1, gdy wartość zwróci false, czyli, że nie ma pliku dane1
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 19:50

Nie wyświetla komunikatu, czyli warunek nie zostaje spełniony. To oznacz, że plik istnieje. Tak się tylko zastanawiam, czy Ty nie wykombinowałeś sobie, że najpierw usuwasz plik a potem w esle sprawdzasz czy plik istnieje. takie założenie byłoby błędne, gdyż zasada działania if else jest taka:

if( warunek) jakiś kod else inny kod

czyli

(jeżeli warunek jest spełniony) jakiś kod (w przeciwnym razie) inny kod.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 19:55

Gdyby było tak, jak mówisz to usunięcie pliku, czyli wartość true sprawiłoby pominięcie wyświetlenia wartości else, czyli komunikatu i odwrotnie.
Pierwsze założenie wykonuje się prawidłowo, tj.: gdy plik istnieje to Memo1 go zaczytuje i później jest usuwany.
Problem jest wtedy, gdy plik nie istnieje, bo wygląda to tak, jakby else był całkowicie pominięty.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 20:00

Drugi warunek czyli else jest pomijany wtedy gdy spełniony zostanie pierwszy warunek czyli if. To zawsze działa, else nie jest wywoływane gdyż warunek if jest spełniony Czy Ty chcesz sprawdzić czy plik został usunięty po wczytaniu?

usunięcie pliku, czyli wartość true sprawiłoby pominięcie wyświetlenia wartości else.


Dokładnie tak, jeżeli if zwraca wartość true, to kod w bloku else jest pomijany. Wywołany może być tylko kod z jednego bloku. Jeżeli if zwraca true, to wywoływany jest kod w bloku if, a jeżeli if jest false, to wywoływany jest kod w bloku else. Tak działają te warunki.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 20:08

@Baronie, zdaje sobie sprawę jak działają warunki - naprawdę.
Gdybym popełnił błąd na pewno widziałbyś go w kodzie.
Sytuacja jest o tyle nietypowa, że wiąże się z zakończeniem działania wywołanych przeze mnie procesów.
Powiem dokładniej:
1. Wywołanie pierwszego procesu nie daje odpowiedzi w wyznaczonym czasie
2. Drugi proces zaczyna działać.
3. Pierwszy nadal działa, drugi już skończył.
4. Rozpoczyna się uruchomienie pętli, pliku brak i w tym momencie brak także komunikatu.

Przyjmując sytuację taką, jak być powinna:
1. Pierwszy ruszył, zakończył.
2. Drugi ruszył, zakończył
3. Oba przestały działać.
4. Odczytanie pętli, plik jest, wyświetlenie danych z niego.

Dokładnie chodzi o ten moment, gdy pierwszy proces działa, a drugi już nie - wtedy else się źle wyświetla w moim przypadku.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 20:20

4. Rozpoczyna się uruchomienie pętli, pliku brak i w tym momencie brak także komunikatu.


Wykonując kod w pętli musisz odświeżać kolejkę komunikatów, czyli coś w tym stylu:

KOD cpp:     UKRYJ  
for(int x = 0; x < 100; x++)
{
  Application->ProcessMessages(); // odświeżenie kolejki komunikatów

 if(FileExists("C:\\dane1")==true)
 {
  Memo1->Lines->LoadFromFile("C:\\dane1");
  DeleteFile("c:\\dane1");
 }
 else
 {
  Memo1->Lines->Add("Brak dostępu do pliku);
 }
}


Jak długo ma działać ta pętla?



1. Wywołanie pierwszego procesu nie daje odpowiedzi w wyznaczonym czasie


Jakiej odpowiedzi?

3. Pierwszy nadal działa, drugi już skończył.


Użyj funkcji CreateProcess, która zatrzyma program aż do czasu zakończenia działania procesu z pkt. 1. Link z wcześniejszej porady.

3. Oba przestały działać.


CreateProcess jak wyżej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 20:34

Cyfrowy Baron napisał(a):Jak długo ma działać ta pętla?


Przypuszczam, że będzie 99 razy sprawdzać czy wyrażenie jest spełnione i wykona odpowiednią akcję, moim zdaniem za każdym razem. Mylę się?

Jakiej odpowiedzi?


Ciężko to sprecyzować, bo to aplikacja firmowa, ale ogólnie pierwszy punkt powoduje połączenie i zalogowanie do serwera, a następnie wydanie polecenia uruchamiającego skrypt. Gdy skrypt się wykona wynik zostanie zapisany do pliku i to oznacza koniec działania pierwszego polecenia.

Użyj funkcji CreateProcess, która zatrzyma program aż do czasu zakończenia działania procesu z pkt. 1. Link z wcześniejszej porady.


Tak spróbuję, ale jak zobaczyłem to co tam napisałeś to się przeraziłem, więc to trochę potrwa ;-)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 20:54

Przypuszczam, że będzie 99 razy sprawdzać czy wyrażenie jest spełnione i wykona odpowiednią akcję, moim zdaniem za każdym razem. Mylę się?


Pytałem o Twoje założenia. Jak długo chcesz by ta pętla działała. Bo można by np. przyjąć, że ma działać tak długo aż pobierze plik, wtedy nie byłoby potrzeba funkcji Slepp. coś w tym stylu:

KOD cpp:     UKRYJ  
while(1)
{
  Application->ProcessMessages(); // odświeżenie kolejki komunikatów

 if(FileExists("C:\\dane1")==true)
 {
  Memo1->Lines->LoadFromFile("C:\\dane1");
  DeleteFile("c:\\dane1");
 
  return;
 }
}
 


Trochę to jednak ryzykowne, gdyż plik musi się pojawić by pętla zakończyła działanie.

Ciężko to sprecyzować, bo to aplikacja firmowa, ale ogólnie pierwszy punkt powoduje połączenie i zalogowanie do serwera, a następnie wydanie polecenia uruchamiającego skrypt. Gdy skrypt się wykona wynik zostanie zapisany do pliku i to oznacza koniec działania pierwszego polecenia.


Czyli aplikacja nie kończy działania?! Jeżeli tak, to CreateProcess na niewiele się zda, gdyż założenie było takie, że po uruchomieniu aplikacji program czeka, aż aplikacja się zamknie. W zamian może coś takiego:

KOD cpp:     UKRYJ  
 WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);

 while(1){ if( FileExists( "lokalizacja pliku dane 1" ) ) return; }

 WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);

 while(1){ if( FileExists( "C:\\dane1" ) ) return; }

 Memo1->Lines->LoadFromFile("C:\\dane1");

 DeleteFile("c:\\dane1");
Jak wspomniałem wcześniej, pliki muszą się pojawić by pętla while przestała działać. Można by ewentualnie wprowadzić jakiś limit dla pętli, czyli np:

KOD cpp:     UKRYJ  
 WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
 
 int x = 0;
 while(1)
 {
   if( FileExists( "lokalizacja pliku dane 1" ) || x >= 10000 )
   {
    return;
   }
   
   x++;
  Sleep(10);// niewielkie opóźnienie dla pętli
 }

 WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);

 x = 0;
 while(1)
 {
   if( FileExists( "C:\\dane1" ) || x >= 10000 )
   {
    return;
   }
   
   x++;
  Sleep(10);// niewielkie opóźnienie dla pętli
 }

 Memo1->Lines->LoadFromFile("C:\\dane1");

 DeleteFile("c:\\dane1");


To taka prowizorka, ale nie wiem z czym dokładnie mam do czynienia.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 09:29

Cyfrowy Baron napisał(a):Czyli aplikacja nie kończy działania?! Jeżeli tak, to CreateProcess na niewiele się zda, gdyż założenie było takie, że po uruchomieniu aplikacji program czeka, aż aplikacja się zamknie.


Kończy działanie, ale nie zawsze w tym samym momencie, bo to zależy od ilości koniecznych działań.
Można to określić na zasadzie na przykład wyników polecenia ping. Czasem pingi mają po 20ms, a czasem powiedzmy po 1000ms, więc ten czas się zmienia. Może też być sytuacja, że ping w ogóle nie dojdzie, ale wtedy jest timeout.
Dokładnie tak samo działa pkt 1, czyli potrzebuje kilka sekund na wykonanie zadań i albo mu się uda, albo nie. Jeśli ta druga opcja to automatycznie przerwie sprawdzanie po chyba 30s.

Jak wspomniałem wcześniej, pliki muszą się pojawić by pętla while przestała działać. Można by ewentualnie wprowadzić jakiś limit dla pętli, czyli np:

KOD cpp:     UKRYJ  
 WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
 
 int x = 0;
 while(1)
 {
   if( FileExists( "lokalizacja pliku dane 1" ) || x >= 10000 )
   {
    return;
   }
   
   x++;
  Sleep(10);// niewielkie opóźnienie dla pętli
 }

 WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);

 x = 0;
 while(1)
 {
   if( FileExists( "C:\\dane1" ) || x >= 10000 )
   {
    return;
   }
   
   x++;
  Sleep(10);// niewielkie opóźnienie dla pętli
 }

 Memo1->Lines->LoadFromFile("C:\\dane1");

 DeleteFile("c:\\dane1");


To taka prowizorka, ale nie wiem z czym dokładnie mam do czynienia.


Muszę spróbować ten fragment z ograniczeniem pętli, bo to powinno wystarczyć.
Nawet, jeśli na zakończenie polecenia trzeba będzie poczekać 30s to ta funkcja i tak się skończy, więc pętla nie będzie trwała w nieskończoność.
Trzeba jednak zmienić ten początek, bo polecenie pierwsze nie zwraca wartości w formie pliku na komputerze lokalnym tylko na serwerze, więc pętla go nie zobaczy, ale spróbuje to zmienić.
Dzięki za podpowiedź, zaraz dam znać co wyszło :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 09:42

Ciekawa sprawa.
Pominąłem początek zostawiając sleepa, żeby sprawdzić czy zadziała między drugim poleceniem, a odczytem do Memo.
Na koniec dodałem dla sprawdzenia czy jest ok Label1->Caption = "Ok";
Skopiowanie pliku się powiodło, bo pojawił się c:\\dante1, ale dalsze komendy się nie wywołały.
Jakiś pomysł dlaczego? Wygląda to tak, jakby pętla nie widziała tego skryptu w określonej lokalizacji.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 45 gości

cron