Odczyt i zapis zmiennych środowiskowych.

dział ogólny

Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez nowy234 » wtorek, 12 sierpnia 2008, 16:14

Witam.
Chciałbym odczytać do zmiennej w programie zmienną środowiskową CLASSPATH. Jak można to zrobić ? i czy można jakoś przysłonić tą zmienną, żeby program (skrypt bat), który ją wykorzystuje pobrał ją właśnie z tej zmiennej? Chodzi mi o napisanie programu w C++ Builder, który będzie uruchamiał pliki bat, korzystające z Javy i ze zmiennej CLASSPATH i który będzie wyświetlał co się dzieje w tych plikach. Coś podobnego do programu na stronie: http://cyfbar.republika.pl/teor13.htm#teor2 : UMIESZCZANIE OKNA OBCEGO PROGRAMU W PROGRAMIE WŁASNYM tylko, że będą to dwa pliki bat, po lewej i prawej stronie. Dopiero się uczę programować. Czy da się coś takiego w ogóle napisać ?

Co do pierwszego to już wiem :).
Kod: Zaznacz cały
    char * zmienna;
    zmienna = getenv ("CLASSPATH");


Natomiast czy można taki program napisać, podzielony na 2 części i żeby każda z części wyświetlała co się dzieje w dwóch plikach bat ? Jeśli można to czy moglibyście mi dać jakieś wskazówki jak najlepiej to zrobić ?
Avatar użytkownika
nowy234
 
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez jabu74 - ekspert » wtorek, 12 sierpnia 2008, 17:49

chcesz wyswietlic zawartosc plikow np. plik1.bat i plik2.bat w odpowiednio Memo1 i Memo2 ?

nie kumam :mrgreen:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez jabu74 - ekspert » wtorek, 12 sierpnia 2008, 17:57

zacznij od czegos prostrzego niz "UMIESZCZANIE OKNA OBCEGO PROGRAMU W PROGRAMIE WŁASNYM"

:P :lol:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » wtorek, 12 sierpnia 2008, 18:49

Ja też nie rozumiem o co chodzi.
Wytłumacz to może "własnemi słowami."

Przypominają mi się słowa polonistki jeszcze z czasów szkoły: "Proszę mi powiedzieć co poeta miał na myśli..."


Co do zmiennych środowiskowych to ► patrz serwis: Cyfrowy Baron dział: porady | API | ścieżki dostępu do katalogów specjalnych (55).
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 nowy234 » wtorek, 12 sierpnia 2008, 21:00

Dobrze. Mam nadzieję, że mnie zrozumiecie bo ciężko tłumaczę. Ale spróbuję. Są dwa pliki bat. Oba są odpowiedzialne za funkcje serwerowe. Pierwszy loginserver:
Kod: Zaznacz cały
@echo off
color 17
title L2EmuProject:  Login Server Console
:start
echo Initializing L2EmuProject LoginServer.
echo.

SET OLDCLASSPATH=%CLASSPATH%
call setenv.bat

REM ########################################################################
REM # You need to set here your JDK/JRE params in case of x64 bits System. #
REM # Remove the "REM" after set PATH variable                             #
REM # If you're not a x64 system user just leave                           #
REM ########################################################################
REM set PATH="type here your path to java jdk/jre (including bin folder)"

java -Dfile.encoding=UTF-8 -Xmx64m net.l2emuproject.loginserver.L2LoginServer

SET CLASSPATH=%OLDCLASSPATH%

if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Admin Restart ...
echo.
goto start
:error
echo.
echo LoginServer terminated abnormaly
echo.
:end
echo.
echo LoginServer terminated
echo.
pause

Jest on odpowiedzialny za logowanie. Za wiele tam sie nie wyświetla. Tylko ładowanie plików jar.
Plik setenv to coś takiego:
Kod: Zaznacz cały
REM - L2Emu -Loginserver Main Jars
SET CLASSPATH=%CLASSPATH%;./lib/l2emuproject-login-1.0.0.jar
SET CLASSPATH=%CLASSPATH%;./lib/l2emuproject-commons-2.0.8.jar

REM -L2J Server MMOCORE Jar
SET CLASSPATH=%CLASSPATH%;./lib/l2j-mmocore-1.0.11.jar

REM - Spring
SET CLASSPATH=%CLASSPATH%;./lib/spring-2.5.3.jar

REM Hibernate Associated Jars
SET CLASSPATH=%CLASSPATH%;./lib/hibernate-3.2.6.ga.jar
SET CLASSPATH=%CLASSPATH%;./lib/ehcache-1.2.3.jar
SET CLASSPATH=%CLASSPATH%;./lib/antlr-2.7.6.jar
SET CLASSPATH=%CLASSPATH%;./lib/asm-1.5.3.jar
SET CLASSPATH=%CLASSPATH%;./lib/asm-attrs-1.5.3.jar
SET CLASSPATH=%CLASSPATH%;./lib/jta-1.0.1B.jar
SET CLASSPATH=%CLASSPATH%;./lib/dom4j-1.6.1.jar
SET CLASSPATH=%CLASSPATH%;./lib/commons-collections-2.1.1.jar
SET CLASSPATH=%CLASSPATH%;./lib/cglib-2.1_3.jar
SET CLASSPATH=%CLASSPATH%;./lib/commons-logging-1.1.jar
SET CLASSPATH=%CLASSPATH%;./lib/commons-lang-2.1.jar
SET CLASSPATH=%CLASSPATH%;./lib/commons-beanutils-1.7.0.jar

REM - L2Emu Commons Associated Jars
SET CLASSPATH=%CLASSPATH%;./lib/c3p0-0.9.1.2.jar
SET CLASSPATH=%CLASSPATH%;./lib/log4j-1.2.14.jar
SET CLASSPATH=%CLASSPATH%;./lib/mysql-connector-java-5.1.6.jar
SET CLASSPATH=%CLASSPATH%;./lib/javolution-5.2.6.jar
SET CLASSPATH=%CLASSPATH%;./lib/commons-io-1.2.jar
SET CLASSPATH=%CLASSPATH%;./lib/bsf-2.0.jar

REM for configuration
SET CLASSPATH=%CLASSPATH%;./config/
SET CLASSPATH=%CLASSPATH%;.


Drugi :

Kod: Zaznacz cały
@echo off
color 17
title L2EmuProject:   Game Server Console
:start
echo Initializing L2EmuProject GameServer.
echo.

REM ----------- Set Class Paths and Calls setenv.bat -----------------
SET OLDCLASSPATH=%CLASSPATH%
call setenv.bat
REM ------------------------------------------------------------------

REM #======================================================================#
REM # You need to set here your JDK/JRE params in case of x64 bits System. #
REM # Remove the "REM" in order to set PATH variable                       #
REM # If you're not a x64 system user just leave                           #
REM #======================================================================#
REM set PATH="type here your path to java jdk/jre (including bin folder)"

REM -------- Default parameters server --------------------------------------
java -Dfile.encoding=UTF-8 -Xmx512m net.l2emuproject.gameserver.util.BootManager
REM -------------------------------------------------------------------------

REM ----------------------- For debug purpose (for devs), use this :  ---------------
REM java -Dfile.encoding=UTF-8 -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7456 net.l2emuproject.gameserver.util.BootBootManager
REM ---------------------------------------------------------------------------------

REM ----- If you have a big server and lots of memory, you could experiment for example with ------------
REM java -server -Dfile.encoding=UTF-8 -Xmx1536m -Xms1024m -Xmn512m -XX:PermSize=256m -XX:SurvivorRatio=8 -Xnoclassgc -XX:+AggressiveOpts
REM -----------------------------------------------------------------------------------------------------

SET CLASSPATH=%OLDCLASSPATH%

if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Administrator Restarted ...
echo.
goto start
:error
echo.
echo GameServer Terminated Abnormaly, Please Verify Your Files.
echo.
:end
echo.
echo GameServer Terminated.
echo.
pause

Oprócz ladowania plików jar wyświetla jeszcze dużo innych rzeczy, np błędy pakietów, itd.
W systemie oba pliki można włączać i oba się uruchomią.
Chciałem zrobić taki program, że podczas wciśnięcia przycisku z 1 plikiem bat wyświetlił mi to co się ładuje w tym pierwszym pliku tylko że na pierwszej połowie okna. A jak się wciśnie drugi to będzie ładowało to drugie i wyświetlało. Chodziło mi na początku bardziej właśnie o to żeby był to program, który tylko łączy te 2 okienka. Teraz pytania:
1) Jak można wyświetlić w memo to co wyświetla konsola?
2) Jeśli uda mi się wyświetlić w memo to jak będzie ze stabilnością programu(będą już w sumie 2 równorzędnie działające procesy a 3 to będzie program jeśli dobrze myślę) ?
Będę wdzięczny za odpowiedź.
Pewnie trochę komplikuję sobie życie, ale co to za życie bez uczenia się na błędach i dziwnych pomysłach :)
P.S.
Trochę programować umiem, ale tylko w DEVCPP a nie miałem jeszcze do czynienia z interfejsami graficznymi. Dopiero korzystam ze strony i się uczę wszystkiego.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
nowy234
 
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Cyfrowy Baron » środa, 13 sierpnia 2008, 09:33

1) Jak można wyświetlić w memo to co wyświetla konsola?
   Nie można.

2) Jeśli uda mi się wyświetlić w memo to jak będzie ze stabilnością programu(będą już w sumie 2 równorzędnie działające procesy a 3 to będzie program jeśli dobrze myślę) ?
   Nie ma znaczenia ile będzie procesów jeżeli zostaną uruchomione jako odrębne wątki.


Sugerowałbym zrezygnować z Memo bo to nie uda się przechwycić zawartości konsoli.
Możesz to zrobić w ten sposób, że uruchamiasz konsolę dla każdego pliku oddzielnie, z poziomu programu oczywiście, potem przechwytujesz obydwa okna konsoli i umieszczasz je w oknie własnego programu jedno obok drugiego i już masz to u siebie w programie.
► patrz serwis: Cyfrowy Baron dział: teoria | umieszczanie okna obcego programu w programie własnym.
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 » środa, 13 sierpnia 2008, 10:44

A może po prostu zapis do pliku?
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 Koziol » środa, 13 sierpnia 2008, 12:50

Żart: Oj widze że ktoś chce piracki serwer do L2 stawiac ^^'
hehehe.. L2J czy cos innego to jest ?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez nowy234 » środa, 13 sierpnia 2008, 13:43

L2J. Ale nie jest to żadem piracki serwer. Są to oryginalne pliki pisane przez ludzi. Ja chciałem zrobić graficzny interfejs i konfigurację do niego bo 5 plików bat trzeba uruchomić żeby to włączyć a ja chciałem to umieścić w 1 programie wszystko. A i tak uczę się programować w builderze więc jest to wyzwanie. :) Dziękuję za pomoc.
Avatar użytkownika
nowy234
 
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez Koziol » środa, 13 sierpnia 2008, 14:37

można stworzyc dwa pliki bat.
jeden do login serwer, drugi do serwera gry.
przeszukam archiwum na dysku to moze znajde - sam kiedys mialem wlasny serwer ale mi sie to znudzilo xD


ale i tak duzo lepsze jest L2OFF oparte o technologie C# obsłuzy hmmm... do 10000 klientów xD
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Odczyt i zapis zmiennych środowiskowych.

Nowy postprzez kinio » piątek, 15 sierpnia 2008, 15:08

Cześć

1) Jak można wyświetlić w memo to co wyświetla konsola?
Nie można.

:!: :!: :!: Oczywiście że można :!: :!: :!:
Nigdy nie mówcie nigdy!!! Nie znacie takiego powiedzenia?
Sam kiedyś napisałem taki programik który uruchamiał inny i przechwytywał to co miał wyświetlić na konsoli. Czy to o coś takiego Ci chodzi? Jeżeli tak to mogę umieścić kod z mojego programu, na pewno się przyda!!!

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 » piątek, 15 sierpnia 2008, 15:36

Nigdy nie mówcie nigdy!!! Nie znacie takiego powiedzenia?


Tak to każdy może udzielać porad. Masz coś działającego na poparcie swoich słów?!

Sam kiedyś napisałem taki programik który uruchamiał inny i przechwytywał to co miał wyświetlić na konsoli. Czy to o coś takiego Ci chodzi?!


Ne chodzi o to, żeby program przechwytywał to co sam wysyła do konsoli, bo to akurat żaden problem zrobić. Chodzi o to, żeby program przechwytywał wszystko to co jest wyświetlane w konsoli, czyli np. program uruchamia jakiś plik *.BAT zawierający szereg instrukcji, a potem przechwytuje do np. Memo to co jest wyświetlane w tej konsoli na bieżąco, czyli konsola wykonuje po kolei jakieś instrukcje i dokładnie to samo pojawia się w Memo.
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 » piątek, 15 sierpnia 2008, 20:26

Witam!
Tak to każdy może udzielać porad. Masz coś działającego na poparcie swoich słów?!

Z całym szacunkiem nie wysłałem tego w momencie pisania poprzedniego postu bo akurat nie byłem na swoim kompie. Program który pisałem miałem gdzie indziej.
Więc dlaczego te nerwy?
Powiem tylko tyle że każdy równie dobrze też może powiedzieć że się nie da, że nie można, ale niech to także udowodni tak jak to jest ode mnie wymagane.

Co do programu to wrzucę go za moment tylko troszkę opiszę komentarzami.

Pozdr!
Ostatnio edytowano piątek, 15 sierpnia 2008, 21:33 przez kinio, łącznie edytowano 1 raz
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 » piątek, 15 sierpnia 2008, 23:42

Cześć!!!

A więc umieszczam obiecany kod. Trochę go opisałem ale nie wiem czy to wystarczy bez poprawnego rozumienia jak działa przekierowywanie strumieni w Windows.

Ponieważ tutaj chodzi o plik wsadowy więc opiszę krótko jak to jest z programami konsolowymi. Program który uruchamia się w konsoli posiada swoje domyślne standardowe wejście jakim jest klawiatura, oraz standardowe wyjście którym jest konsola. Windows umożliwia przekierowanie danych zarówno ze standardowego wejścia i wyjścia na inne urządzenie. Przy pomocy konsoli efekt ten jest bardzo łatwo uzyskać wystarczy użyć specjalnych operatorów.

Jeżeli mamy jakiś program prog.exe który wyświetla nam w konsoli jakieś informacje, to bardzo łatwo możemy to przekierować na plik np. a.txt:

Kod: Zaznacz cały
C:\>prog.exe > a.txt


Jeżeli nasz program także umożliwia wprowadzenie jakiś danych za pomocą klawiatury, to możemy zamiast klawiatury użyć np. pliku:

Kod: Zaznacz cały
C:\>prog.exe < a.txt


No i w końcu jeżeli chcemy aby na zapisane w pliku dane program wydrukował odpowiedź do pliku to wystarczy napisać:

Kod: Zaznacz cały
C:\>prog.exe < a.txt > b.txt


i w pliku b.txt będzie odpowiedź programu na dane z pliku a.txt.

Wstęp ten był potrzebny aby zrozumieć jak wywoływane są pliki wsadowe *.bat.
Tak naprawdę instrukcje zapisane w plikach wsadowych mogą być równie dobrze zapisane w zwykłych plikach tekstowych i uruchomione poleceniem przekierowania strumienia na program - interpreter tych instrukcji (w tym przypadku cmd.exe):

Kod: Zaznacz cały
cmd.exe < polecenia_pliku_bat.txt


Czyli tylko rozszerzenie *.bat mówi systemowi że trzeba dokonać takiego przekierowania i dlatego do uruchomienia pliku wsadowego wystarczy na niego kliknąć.

Weźmy na przykład prosty plik wsadowy a.bat o treści:

Kod: Zaznacz cały
echo konsola
copy a.txt b.txt
mkdir newdir


uruchamiając taki plik wsadowy w konsoli poleceniem:

Kod: Zaznacz cały
a.bat


na ekranie pojawi się nam:

Kod: Zaznacz cały
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\>echo konsola
konsola

C:\>copy a.txt b.txt
        1 file(s) copied.

C:\>mkdir newdir

C:\>

W tym wypadku system przekierował treść pliku wsadowego na program cmd.exe a program cmd.exe pokazał rezultat na swoim standardowym wyjściu czyli konsoli. Czyli pisząc:

Kod: Zaznacz cały
cmd.exe < polecenia_pliku_bat.txt > rezultat.txt


w pliku "rezultat.txt" otrzymamy powyższe linie które wcześniej się ukazały w konsoli, natomiast konsola będzie pusta.

Właśnie w ten sposób trzeba podejść do przekierowywania strumieni, czyli jak opisał Cyfrowy Baron jest bardzo nie ścisłe:

Program uruchamia jakiś plik *.BAT zawierający szereg instrukcji, a potem przechwytuje do np. Memo to co jest wyświetlane w tej konsoli na bieżąco, czyli konsola wykonuje po kolei jakieś instrukcje i dokładnie to samo pojawia się w Memo.


Oczywiście też nie do końca ponieważ można uzyskać dostęp do konsoli i z jej bufora i odczytać dane, ale jest to znacznie bardziej skomplikowane.
Proponowane przeze mnie rozwiązanie to utworzenie właśnie mechanizmu (pipe) umożliwiającego przekierowanie danych na inne wejścia/wyjścia standardowe.
Pipe to jest programowy odpowiednik operatorów przekierowania: '<' '>'.

Więc w moim rozwiązaniu to wszystko działa tak:
Wczytujemy dowolny plik w formacie tekstowym w którym są zapisane instrukcje do wykonania przez jakiś program (tutaj cmd.exe). Następnie tworzymy interfejs przekierowań w obie strony. Tak aby można było pisać do procesu i wyciągać rezultaty (zupełnie jak w przypadku C:\>prog.exe < a.txt > b.txt), gdzie prog.exe to nasz cmd.exe, a.txt to nasz plik wsadowy a b.txt to np. Memo.
Interfejs pipe zawsze posiada dwa końce (jak to rura) jeden do czytania i drugi do pisania. Tak więc definiując pipe dla standardowego wyjścia mamy dwa uchwyty jeden do pisania na to wyjście a drugi do odczytu co tam zapisano. Podobnie jest dla wejścia. W sumie daje nam to 4 uchwyty.

W podesłanym archiwum znajdziecie wszystko co potrzeba na początek. Znajdziecie tam klasę pipeCtrl zdefiniowaną w plikach: pipe_ctrls.h i pipe_ctrls.cpp, która udostępnia prosty interfejs do kontroli pipe-ów, oraz przykładowy programik który pokazuje jak jej użyć (bardziej ambitnych odsyłam do lektury http://msdn.microsoft.com). W razie pytań, sugestii, uwag piszcie!!!
Pliki zawierają konfigurację którą można zmienić w zależności od uruchamianych procesów. Może się okazać że ustawiony bufor jest za mały, lub czas oczekiwania na przetworzenie danych za krótki.
Wszystko można sobie pozmieniać według upodobań.

UWAGA :!:
Mam specyficznie skonfigurowanego BCB i do tego dużo różnych dodatków, więc nie wiem czy będzie chciał poprawnie skompilować plik .bpr. Jeżeli nie to proponuje najprostsze rozwiązanie, utworzyć nowy projekt i dodać moje pliki do tego projektu: pipe_ctrls.cpp oraz Unit1.cpp. Natomiast sam program powinien się uruchomić bez problemu.

Powodzenia :!:

P.S. Taka mała uwaga co do formatu pliku instrukcji. Ostania linia pliku powinna być pusta, czyli po ostatniej nie pustej linii wystarczy enter.

Mam nadzieje że wszystko działa!! Proszę o feedback bo kod troszkę zmieniłem i nie wiem czy bug-a gdzieś nie walnąłem!!
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, 09:11

Więc dlaczego te nerwy?


Nie chciałem nikogo urazić, ale często forumowicze, pisząc porady posługują się ogólnikami, które niczego nie wnoszą.



Jestem pod wrażeniem, nawet nie przyszło mi do głowy takie rozwiązanie, szukałem raczej sposobu opartego na hakach systemowych, takie skrzywienie.

Nieco sobie uprościłem Twój kod i zawarłem całość w jednym zdarzeniu, czyli konsola jest uruchamiana i od razu wykonuje polecenia zawarte w pliku.
Zauważyłem również, że klasa pipeCtrl uruchamiając konsolę, próbuje wymusić jej minimalizację z marnym efektem. Pozwoliłem więc sobie wprowadzić drobną modyfikację do pliku pipe_ctrls.cpp do funkcji CreateProcess, tak by konsola była uruchamiana jako ukryta, nie minimalizowana. Zrealizowałem to zadanie poprzez pobranie uchwytu do okna konsoli i wysłanie komunikatu SW_HIDE (jak widzisz mam słabość do haków).
Tak wygląda ta funkcja po modyfikacji:


Kod: Zaznacz cały
int pipeCtrl::createProcess(void)
{
     if(!FileExists(_exe_module))
          return setLastError(PIPE_EXE_MODULE_DOES_NOT_EXIST);

     CHAR* szCmdline = _exe_module.c_str();       // linia polecen - sciezka do modulu wykonywalanego
     STARTUPINFO siStartInfo;                     // parametry startowe - aby moc przekierowac strumien nalezy

ustawic flage STARTF_USESTDHANDLES
     BOOL bSuccess = FALSE;

     ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));

     // Konfiguracja startowa
     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;
     siStartInfo.wShowWindow = SW_FORCEMINIMIZE;

     bSuccess = CreateProcess(NULL, szCmdline, NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo);
     

     lab_1:
     HWND hWnd = FindWindow("ConsoleWindowClass", NULL);
     if(hWnd == NULL && bSuccess) goto lab_1;           // tutaj występuje ryzyko zapętlenia kodu, można dodać licznik cofnięć
     ShowWindow(hWnd, SW_HIDE);


     // Jezeli blad to zwrcamy wartosc bledu
     if (!bSuccess)
          return PIPE_CREATE_PROCESS_ERROR;
     
     return PIPE_SUCCES;
}


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, ja pobierałem ścieżkę dostępu do konsoli tak:

Kod: Zaznacz cały
  char pathCMD[MAX_PATH];
  GetSystemDirectory(pathCMD, MAX_PATH);
  String console = (String)pathCMD + "\\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.

Chciałbym zmieścić Twoją bibliotekę i podane przez Ciebie rozwiązanie problemu jako poradę w serwisie Cyfrowy Baron, oczywiście z informacją, że ty jesteś autorem tego pomysłu. Możesz również sam napisać poradę, jeżeli tak wolisz.
Czekam na na odpowiedź czy się zgadzasz.
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

Nastę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 20 gości

cron