[c++] zmienne środowiskowe

0

Witam. Pisze program rozproszony, gdzie miedzy procesami komunikuje sie poprzez zmienne srodowiskowe. w teorii kazdy nowo stworzony proces powinien dzidziczyc zmienne srodowiskowe od procesu tworzacego i w procesach potomnych zmienne te powinny byc od razu dostepne.

tak wyglada kod procesu macierzystego

//#include "stdafx.h"
#include <sstream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;

#define zmSROD TEXT("Char");


int _tmain(int argc, _TCHAR* argv[])
{
	

	STARTUPINFO startupInfo = {0};
	startupInfo.cb = sizeof(startupInfo);

	PROCESS_INFORMATION processInformation;


	string nazwaZmiennej = "zmSROD";
	string wartoscZmiennej = "lalalala";
	

	if( ! SetEnvironmentVariable((LPCWSTR)nazwaZmiennej.c_str(), (LPCWSTR)wartoscZmiennej.c_str()) )
		cout << "nie udalo sie ustawic zmiennej srodowiskowej";
	else
		cout << "udalo sie ustawic zmienna srodowiskowa";

	for(int i = 0; i<10 ; i++)
	{
		
		BOOL result = ::CreateProcess(
			L"K:\\rozproszoneCwiczenia\\kodWykonywalny\\Debug\\kodWykonywalny.exe",
			NULL,
			NULL,
			NULL,
			FALSE,
			NORMAL_PRIORITY_CLASS,
			NULL,
			NULL,
			&startupInfo,
			&processInformation
			);

		if(result == 0)
			throw std::runtime_error("Could not create process");
	}

//}
	
	return 0;
}

a tak kod procesu potomnego

//#include "stdafx.h"
#include <sstream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;

#define zmSROD TEXT("Char")

int _tmain(int argc, _TCHAR* argv[])
{
	char out[8] = {0, };
	string tekst = "zmSROD";
	string tekst2 = "out";
	string tekst3 = "8";
    if( ! GetEnvironmentVariable((LPCWSTR)tekst.c_str(), (LPWSTR)tekst2.c_str(), (DWORD)tekst3.c_str()) )
		cout<< "nie dziala";
	else
		cout<< "dziala";


	cout<<out;


	

	return 0;
}

No i niestety nie dziala to jak na razie, otoz ustawienie zmiennej sygnalizuje mi ze dziala, tyle ze w systemie jak sprawdzam jej nie ma. natomiast odczytanie zmiennej w ogóle zwraca wartosc zero co sygnalizuje komunikatem ze nie dziala.
co z tym zrobic ?

0

Z tego co przeczytalem wlasnie na MSDN o funkcji GetEnvironmentVariable to jako drugi parametr przyjmuje buffor do zapisu zmiennej, a u Ciebie jest bufor ale nie uzywasz go w tej funkcji oraz jest tablica, w ktorej moze sie nie zmiescic ta zmienna poniewaz tam tez zostanie zapisana jej wartosc, a to wszystko przekracza 8 charow.

Ja bym zaalokowal bufor np za pomoca GlobalAlloc jesli ma to byc WinApi.

0

dzieki za naprowadzenie. rzecz w tym ze probowalem wyswietlic wartosc tego parametru, a nie parametr.
zamiast

cout<<out

powinno byc po prostu

cout<<tekst2

dziala jak nalezy.
dziekowac t0m_k ' u

a tak przy okazji, gdzie mozna znalezc wartosci tych ustawionych zmiennych w systemie ?
mojkomputer -> zaawansowane -> zmienne srodowiskowe - tam patrzylem i ich nie ma ;>

0

Z tego co pamietam poleceniem
set
w konsoli, ale nie dam sobie reki za to uciac ;)

Od strony programu zmienne mozesz pobrac przy pomocy
int main(int argc, char *argv[], char *envp[])
w envp masz zapisane.

0

owszem, za pomoca set odczytuje zmienne komputera, jednak tych ktore tworze w programie nie ma. jednak program dziala, wiec albo to chodzi o jakies inne zmienne srodowiskowe, albo one od razu po skonczeniu procesu ulegaja zniszczeniu.
wlasciwie nie jest mi potrzebne by ustawiac je na stale, jednak jak ktos wie jak to zrobic to moze napisac, bo mje to ciekawi ;)
generalnie mysle sobie ze kazdy proces ma swoje zmienne srodowiskowe, i te wywolane za pomoca set to pewnie jakis glowny proces systemowy je posiada. taka moja hipoteza.
jak znajde odpowiedz na ten temat to napisze. pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1