Windows API - pobranie zmiennej środowiskowej CLIENTNAME

0

Hej! Musze jakoś wykryć czy program uruchamiany jest z terminala czy "lokalnie".
No i można to zrobić badając czy jest zmienna środowiskowa CLIENTNAME.
Napisałem taką funkcję, która sprawdza czy jest zadana zmienna, ale coś nie działa :/ Zawsze pokazuje, że nie ma takiej zmiennej, na Windows 2008 Server jest taka zmienna na pewno (w konsoli echo %CLIENTNAME% pokazuje nazwę komputera)...

Kod funkcji :

bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
	DWORD dwRet, dwErr;
	LPTSTR pszOldVal;
	pszOldVal = (LPTSTR) malloc(4096*sizeof(TCHAR));

	dwRet = GetEnvironmentVariable(lpNazwaZmiennej, pszOldVal, 4096);
	pszOldVal = (LPTSTR) malloc(4096*sizeof(TCHAR));
	if(pszOldVal == NULL)
    {
	MessageBox(NULL, TEXT("Brak pamięci przy pobieraniu zmiennej środowiskowej! "), TEXT("Bład"), MB_OK | MB_ICONERROR);
        return FALSE;
    }
    if(dwRet==0)
    {
        dwErr = GetLastError();
        if( ERROR_ENVVAR_NOT_FOUND == dwErr )
        {
			free(pszOldVal);
           return false;
        }
		else
		{
			free(pszOldVal);
			return true;
		}
	}
	return false;


}
 
 
Wywołanie funkcji : 
bool bCzyProgramJestWTerminalu;
bCzyProgramJestWTerminalu = SprawdzCzyJestZmiennaSrodowiskowa(TEXT("CLIENTNAME"));

No i zawsze jest false, czyli że nie ma takiej zmiennej, nawet jak jest...A może jest inna lepsza metoda na sprawdzenie, czy program działa w terminalu czy nie ?
Z góry dzięki za pomoc....

1

komplikujesz. i do tego masz wyciek pamięci...

bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
	TCHAR buf[32767];
	return GetEnvironmentVariable(lpNazwaZmiennej, &buf[0], 32767) > 0;
}
0

Jutro jeszcze sprawdzę ten kod...
W sumie mogę jeszcze użyć getenv, albo raczej _wdupenv_s Microsoftowego... Ale to jutro sprawdzę :)
Co do tego kodu wyżej to korzystałem z przykładu Z MSDN (z przykładu nr 2)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009%28v=vs.85%29.aspx

1

MSDN mówi, że podanie bufora dla funkcji GetEnvironmentVariable jest opcjonalne.

bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
        return GetEnvironmentVariable(lpNazwaZmiennej, NULL, 0) > 0;
}
0

Przerobiłem ten kod na taki :

bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
	DWORD dwRet, dwErr;
	dwRet = GetEnvironmentVariable(lpNazwaZmiennej, NULL, 0);

    if(dwRet==0)
    {
		dwErr = GetLastError();
        if( ERROR_ENVVAR_NOT_FOUND == dwErr )
        {
           return false;
        }
		else
		{
			return false;
		}
	}

	return true;


}

Wygląda, na to że w praktyce działa... :)
Próbowałem używać też funkcji o fajnej nazwie : _wdupenv_s i też działa... (Kompilator C++ z MS VS 2010 krzyczał, że getenv jest już przestarzała i niebezpieczna).

2
if( ERROR_ENVVAR_NOT_FOUND == dwErr )
{
   return false;
}
else
{
    return false;
}

Perełka! :D

1

Żebyś się nie zdziwił, jak kiedyś napisałem kod w stylu:

return ERROR_ENVVAR_NOT_FOUND == dwErr

To musiałem wyjaśniac lokalnemu master wymiataczowi że to jest ok (i to akurat nie ten od .net, on raczej w javie pisze).

1
bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
        DWORD dwRet, dwErr;
        dwRet = GetEnvironmentVariable(lpNazwaZmiennej, NULL, 0);
 
    if(dwRet==0)
    {
                dwErr = GetLastError();
        if( ERROR_ENVVAR_NOT_FOUND == dwErr )
        {
           return false;
        }
                else
                {
                        return false;
                }
        }
 
        return true;
 
 
}

Nie prościej tak?

bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
        return GetEnvironmentVariable(lpNazwaZmiennej, NULL, 0);
}
1

Przecież napisaliśmy ci całą funkcję. Nie musisz dodatkowo sprawdzać czy GetLastError() zwróci ERROR_ENVVAR_NOT_FOUND. Puste zmienne środowiskowe (takie nawet bez znaku końca linii) to nieistniejące zmienne środowiskowe.

0

Aleeee gafaaaaa........... no jasne, ze tak :D
Po prostu przez chwilę myślałem, że dwErr może zwracać jakieś inne wartości oprócz ERROR_ENVVAR_NOT_FOUND i tak jakoś...
Jutro to poprawie...
Swoją drogą programowanie w czystym Windows API nie jest aż tak przyjemne, no ale zawsze to jakaś nauka jest :)
Tym bardziej pisanie DLLek pod środowisko Clipperowe :D

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