Odczyt i zapis zmiennych środowiskowych.

dział ogólny

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » sobota, 16 sierpnia 2008, 09:20

Witam!

Jak już pisałem kod nieco zmieniałem i nie wszystko może działać, dlatego dziękuję za poprawki!!

Tak sobie myślę, że mogłeś pokusić się tutaj o pewne uproszczenie i zdefiniować ścieżkę dostępu do konsoli już wewnątrz klasy, tak by nie trzeba było jej podawać w programie, gdyż Windows zawsze ma konsolę w katalogu System32.

Oczywiście takie uproszczenie jest jak najbardziej OK, pod warunkiem że jako proces będzie się tworzyć tylko konsole. W programiku jak pewnie zauważyłeś można zdefiniować ścieżkę do innego programu (tutaj raczej konsolowego) i przechwytywać dane z innego programu nie koniecznie tylko cmd.exe.

Podane przez Ciebie rozwiązanie ma zasadniczą wadę, nie pozwala na ingerencję w działania konsoli. Jeżeli podczas działania pojawi się jakieś pytanie w konsoli typu TAK/NIE/ANULUJ, to nie można wysłać do niej odpowiedzi.

To dziwne u mnie działa. W polu edit wpisujemy odpowiedź i klikamy wyślij. Być może się wkradł jakiś bug, sprawdzę!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » sobota, 16 sierpnia 2008, 09:27

To dziwne u mnie działa. W polu edit wpisujemy odpowiedź i klikamy wyślij. Być może się wkradł jakiś bug, sprawdzę!


Nie próbowałem z polem Edit, po prostu przerobiłem nieco kod i umieściłem w własnym projekcie.

Nie odpowiedziałeś na pytanie, czy zgadzasz się na zamieszczenie Twojego pomysłu jako poradę i czy ewentualnie sam chcesz taką poradę napisać. Szykuję właśnie aktualizację, więc wkrótce by się to pojawiło.
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
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » sobota, 16 sierpnia 2008, 09:31

Aha a co do umieszczenia tego w bazie porad, to jak najbardziej jestem za. Tylko najpierw dobrze by było dopracować to na tyle aby nie było jakiś niespodzianek, a pewnie jakieś mogą się pojawić.
Jak tylko będę miał trochę więcej czasu, to jeszcze przysiądę i coś poprawię, dam znać, tym czasem byłbym wdzięczny za właśnie jakiś feedback o bug-ach!!

Dzięki za nowy status :w czy jak to się tam nazywa 8-)
Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » sobota, 16 sierpnia 2008, 09:49

Witam!

No tak, masz racje CB. Okienko nie chce się ukryć.
Twoje rozwiązanie jest ok, ale faktycznie może się coś niepotrzebnie zapętlić. Proponuje inne rozwiązanie, w strukturze konfiguracji startowej procesu nie dodałem flagi aby proces użył mojej wskazówki.
trzeba zmienić linie:

Kod: Zaznacz cały
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

na:
Kod: Zaznacz cały
siStartInfo.dwFlags |= (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);

gotowe.
Aha no i lepiej faktycznie zamiast używać SW_FORCEMINIMIZE to lepiej jest użyć SW_HIDE, czyli cała konfiguracja startowa powinna tak wyglądać:

Kod: Zaznacz cały
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
     siStartInfo.cb = sizeof(STARTUPINFO);
     siStartInfo.hStdError = _child_std_output_write;
     siStartInfo.hStdOutput = _child_std_output_write;
     siStartInfo.hStdInput = _child_std_input_read;
     siStartInfo.dwFlags |= (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
     siStartInfo.wShowWindow = SW_HIDE;


Dołączam poprawiony plik.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » sobota, 16 sierpnia 2008, 11:19

Jest jeszcze jedna rzecz, którą mógłbyś poprawić. Mianowicie po pierwszym uruchomieniu pliku BAT wszystko gra, ale próba ponownego uruchomienia tego pliku skutkuje błędem "Błąd otwarcia pliku", trzeba ponownie uruchomić program by można było jeszcze raz uruchomić ten sam plik. Sam bym spróbował naprawić ten błąd, ale sam zapewne dobrze wiesz jak trudno analizować kod napisany przez innych, szczególnie tak złożony. Za przykład niech posłuży poprawka którą ja naniosłem, początkowo też próbowałem ustawić siStartInfo.wShowWindow = SW_HIDE; ale nie zwróciłem uwagi na to, że nie zdefiniowałeś odpowiednio flagi więc uznałem, że to jakieś ograniczenie wynikające z konstrukcji kodu, więc zdecydowałem się na komunikat.



Dzięki za nowy status :w czy jak to się tam nazywa 8-)


To jest ranga specjalna, wszyscy mają jakąś rangę (muszę nad tym jeszcze popracować0, ale tylko niektórzy mają rangi specjalne. Jeżeli forum się rozwinie to utworzę jeszcze grupy, bo na razie wszyscy należą do grupy domyślnej użytkownicy zarejestrowani.

Proponuję dołączyć avatar tak dla odróżnienia. Awatary nie są dostępne w procesie rejestracji, ale każdy zarejestrowany użytkownik może go sobie dodać lub zmienić w Panelu użytkownika. Zalecam zresztą skonfigurować sobie forum wg. własnych potrzeb właśnie w tym panelu. Można zmienić wszystko za wyjątkiem nazwy użytkownika, e-mail'a, rangi i zezwoleń.
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
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez wargo » sobota, 16 sierpnia 2008, 12:43

Cyfrowy Baron napisał(a): Można zmienić wszystko za wyjątkiem nazwy użytkownika, e-mail'a, rangi i zezwoleń.

Adres e-mail da się zmienić.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » sobota, 16 sierpnia 2008, 13:10

Witam!

Sam bym spróbował naprawić ten błąd, ale sam zapewne dobrze wiesz jak trudno analizować kod napisany przez innych, szczególnie tak złożony.

Rozumiem i poprawiłem. Dodatkowo wprowadziłem jeszcze jedną poprawkę - zabijania procesu.
Zmienione pliki sÄ… w archiwum.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 18 sierpnia 2008, 11:13

W pliku pipe_ctrl.h zabrakło definicji, którą dodałem:

#define PIPE_CHILD_PROCESS_CLOSE_ERROR -13

Kolejna sprawa, w kodzie Twojego programu dostrzegłem pewien błąd-nie-bląd, nie jestem pewien czy nie wywoła to błędu:

Kod: Zaznacz cały
     if(pc != NULL)
        delete pc;

    pc = new pipeCtrl(console, readpipe);


Jeżeli pc okaże się różne od NULL, to czy jego usunięcie nie spowoduje błędów w dalszym wykonywaniu instrukcji - nie sprawdzałem tego. Jeżeli tak, to czy nie powinno się zastosować funkcji return.

Kolejna sprawa to funkcja readpipe:
Kod: Zaznacz cały
void readpipe(char* __buff)
{
    String text = String(__buff);

    int pos = text.Pos("\n");
    while(pos > 0)
    {
        Form1->Memo1->Lines->Add(text.SubString(1, pos-1));
        text = text.Delete(1, pos);
        pos = text.Pos("\n");
    }
}


czy nie można by jej zawrzeć wewnątrz biblioteki, nie koniecznie jako funkcje klasy pipeCtrl. Jeżeli chcesz zachować pewną uniwersalność klasy, to można wykonywać rzutowanie nie na obiekt klasy Memo, lecz na obiekt klasy TStrings (Memo->Lines, ListBox->Items, itp...), ale nie wiem, być może nie da się zawrzeć tego w bibliotece...
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
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » poniedziaÅ‚ek, 18 sierpnia 2008, 11:33

W pliku pipe_ctrl.h zabrakło definicji, którą dodałem:
Kod: Zaznacz cały
#define PIPE_CHILD_PROCESS_CLOSE_ERROR -13


No tak w archiwum nie umieściłem pliku nagłówkowego z dodaną definicją - moja wina, przepraszam!

Kolejna sprawa, w kodzie Twojego programu dostrzegłem pewien błąd-nie-bląd, nie jestem pewien czy nie wywoła to błędu

No tak błąd nie błąd :) Błąd oczywiście będzie spowodowany tylko w momencie kiedy wskaźnik pc nie będzie NULL oraz będzie pokazywał na obszar pamięci który nie jest zaalokowany obiektem klasy pipeCtrl. Dlatego w każdym miejscu gdzie obiekt jest usuwany, a nowy nie jest tworzony po użyciu operatora delete przypisuję pc = NULL tak aby w innych miejscach kodu wiedzieć czy obiekt jest zaalokowany czy nie. Oczywiście jak wiesz, zawsze można nie używać operatora delete tylko tworzyć nowy obiekt, jednak po długim, nieprzerwanym działaniu programu doprowadzi to do wycieku pamięci.
Programik zawarty w Unit1.cpp ma tylko na celu jak korzystać z metod klasy, natomiast indywidualne rozwiązania są dowolne. Ja na przykład wybierając takie jak przedstawione muszę być konsekwentny i po każdym zwalnianiu pamięci ustawiam pc = NULL; - można też inaczej. Jeżeli bym tego nie zrobił to w tej funkcji pojawi się wyjątek.

Co do funkcji readpipe, to owszem można ją dopisać do klasy, nie ma problemu. Tylko tak jak już pisałem, kod był trochę przerobiony na cele demonstracyjne i przerobiłem tylko co było konieczne. Pierwotnie biblioteka wyglądała i działała troszkę inaczej, ale co jest ważne, jednym z wymagań była jej uniwersalność i niezależność od środowiska, natomiast TMemo, czy klasa TString czy TStringList, są typowe dla BCB. Np. Wcześniej wszystkie stringi były reprezentowane jako char* no i ten wskaźnik do funkcji. Definiowane funkcji readpipe mijało się wtedy z celem. Oczywiście ktoś może powiedzieć że można ją było zadeklarować jako funkcję wirtualną, owszem, ale po co wprowadzać niepotrzebne dziedziczenie do tak prostego interfejsu?

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 18 sierpnia 2008, 11:49

Dopatrzyłem się kolejnej drobnej nieprawidłowości. Wysyłanie odpowiedzi do konsoli działa bez zarzutu, ale konsola po pobraniu odpowiedzi nie wykonuje instrukcji, jedynie pobiera odpowiedź, dopiero ponowne wywołanie funkcji wriePipe powoduje wykonanie instrukcji, trzeba by chyba coś dodać do tej funkcji, żeby po pobraniu instrukcji od razu ją wykonała.
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
    NieznanyNieznana

Poprzednia 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 2 gości