Проверка переменной среды без использования GetLastError() == ERROR_ENVVAR_NOT_FOUND в VC++
Вот мой код
#include<iostream>
#include<Windows.h>
using namespace std;
#define BUFSIZE 4602
#define VARNAME TEXT("zzz")
int main()
{
TCHAR chNewEnv[BUFSIZE];
GetEnvironmentVariable(VARNAME, chNewEnv, BUFSIZE);
if(GetLastError()==ERROR_ENVVAR_NOT_FOUND)
{
cout<<"Hello";
}
else
{
cout<<"Bye";
}
return 0;
}
Я проверяю, доступна ли переменная окружения zzz или нет. Мне нужно сделать то же самое без использования if(GetLastError()==ERROR_ENVVAR_NOT_FOUND)
, Там в любом случае?
Я делаю ту же программу, используя C#, в которой я не использую GetLastError()
, Мне нужно сделать эти две программы похожими, поэтому я спрашиваю без использования GetLastError()
, Вот мой фрагмент C#
string abc =Environment.GetEnvironmentVariable("zzz");
if (abc == null || abc.ToUpper() == "NULL" || abc.ToUpper() == "NUL")
1 ответ
Вы должны использовать GetLastError
, как вы можете встретить случаи, когда переменная определена без значения.
Такие случаи можно эмулировать с помощью:
SetEnvironmentVariable( "foo", "" );
когда GetEnvironmentVariable
вернуть 0, возможно, что переменная не существует или существует с пустым содержимым. В последнем случае GetLastError
возвращает 0
Если вам все равно (то есть: для вас не существует ни одной переменной или пустой), не беспокойтесь о GetLastError
,
Примечание. Вы должны всегда делать первый вызов с аргументом NULL nSize, как указано в документации:
Если lpBuffer недостаточно велик для хранения данных, возвращаемое значение - это размер буфера в символах, необходимый для хранения строки, а ее завершающий нулевой символ и содержимое lpBuffer не определены.
И я только что проверил (Windows 7), в таком случае GetLastError
возвращает 0 (неудобно, если вы спросите меня)
Редактировать: в Windows 7, когда я устанавливаю переменную пользователя на "ноль", значение, полученное с помощью GetEnvironmentVariable
(MBCS) - это 5-байтовая строка 'n', 'u', 'l', 'l', '\0'
Код (UNICODE build):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#define BUFSIZE 4602
#define VARNAME L"zzz"
const wchar_t * MyGetEnv( const wchar_t * pszVarName, wchar_t * pszVarValue,
size_t cbValue ) {
DWORD dwCopied = GetEnvironmentVariable( pszVarName, pszVarValue, cbValue );
// The line bellow MAY BE COMMENTED OUT IF YOU REALLY
// DON'T LIKE GETLASTERROR, AS cbCopied WILL BE ZERO FOR
// NON-EXISTENT VARIABLE
if ( GetLastError() != NO_ERROR ) return NULL; // doesn't exist, or error
if ( dwCopied == 0 ) return NULL; // var is empty
return pszVarValue;
}
int main() {
wchar_t szVarValue[ BUFSIZE ];
const wchar_t * pszVarValue = MyGetEnv( VARNAME, szVarValue,
_countof( szVarValue ) );
if ( pszVarValue == NULL ) {
printf( "No variable or empty value\n" );
} else if ( ( _wcsicmp( pszVarValue, L"null" ) == 0 ) ||
( _wcsicmp( pszVarValue, L"nul" ) == 0 ) ) {
printf( "Special 'null' or 'nul' value\n" );
} else {
wprintf( L"Value is %s\n", szVarValue );
}
return 0;
}