Проверка переменной среды без использования 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 (неудобно, если вы спросите меня)


установка переменной в 7

Редактировать: в 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;

}
Другие вопросы по тегам