Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zmienne środowiskowe w systemie windows

Ostatnio zmodyfikowano 2019-03-17 18:03
Autor Wiadomość
madpl1239
Temat założony przez niniejszego użytkownika
zmienne środowiskowe w systemie windows
» 2019-03-17 15:50:43
Witam serdecznie.

Nurtuje mnie pewien problem. Robię program, który będzie mógł odczytać ale również i utworzyć
wybraną zmienną środowiskową ( lub utworzyć nową zmienną ). Korzystam z MinGW. Wiem, że trzeci argument
funkcji main można wykorzystać do odczytu zmiennych środowiskowych. Ale ja chcę mieć możliwość zmiany wartości
danej zmiennej środowiskowej:)))

próbowałem getenv(), putenv(), które można znaleźć w standardowych nagłówkach kompilatora, ale...

Efektu brak.

Najlepiej jak przedstawię kod źródłowy: frywolną implementację wersji POSIX setenv() i oczywiście main
C/C++
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

#define _ERRCODE 101 //error

int setenv( const char * name, const char * value, int overwrite )
{
    char * code = NULL;
   
    if( !overwrite )
    {
        code = getenv( name );
       
        if( overwrite |( code == NULL ) )
             return _ERRCODE;
       
    }
   
    return putenv( name );
}


int main( int argc, char ** argv, char ** envp )
{
    char str_var[] = "my_var";
    char str_value[] = "value";
    int i = 0;
   
    if( setenv( str_var, str_value,( int ) 1 ) )
         std::cout << "setenv() success." << std::endl;
    else
         std::cout << "setenv() failed." << std::endl;
   
    for(; * envp; envp++, i++ )
    {
        std::cout << * envp << "\n";
    }
   
    std::cout << "number of env = " << i << std::endl;
}

Po uruchomieniu pętla for wylistowała mi wszystkie zmienne środowiskowe a potem ich liczbę zgodnie z kodem main:)))
Ale "my_var" tam nie ma! I to jest mój problem.
P-174205
pekfos
» 2019-03-17 15:58:22
envp zawiera stan zmiennych środowiskowych z momentu uruchomienia programu.
P-174206
madpl1239
Temat założony przez niniejszego użytkownika
» 2019-03-17 16:10:16
To wiem:) W dokumentacji microsoftu znalazłem taki mniej więcej zapis:
"... że envp jest talicą wskaźników do zmiennych środowiskowych..." i logicznie myśląc
zdawałem sobie sprawę, aby zobaczyć wynik działania mojego kodu muszę właśnie w kodzie umieścić
wylistowanie zmiennych środowiskowych. Ale nic to nie dało.

Wychodzi na to, że envp nie jest modyfikowana przez putenv()?

Ale dalej główny problem nie jest rozwiązany stąd mój post na tym zacnym forum:))

P-174207
pekfos
» 2019-03-17 18:03:17
Wychodzi na to, że envp nie jest modyfikowana przez putenv()?
envp zawiera stan zmiennych środowiskowych z momentu uruchomienia programu.
Więc nie po operacjach wykonywanych w programie.

Ale dalej główny problem nie jest rozwiązany
A co dokładnie chcesz osiągnąć? Jak chcesz zmienić napisy pod envp to sobie je skopiuj i modyfikuj do woli. Jak chcesz ustawić zmienną środowiskową na poziomie systemu, to nie tędy droga.
https://docs.microsoft.com​/en-us/windows/desktop​/ProcThread​/environment-variables
Calling SetEnvironmentVariable has no effect on the system environment variables. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message with lParam set to the string "Environment". This allows applications, such as the shell, to pick up your updates.
P-174208
« 1 »
  Strona 1 z 1