在VC ++中不使用GetLastError()== ERROR_ENVVAR_NOT_FOUND检查环境变量

时间:2014-03-18 17:10:43

标签: winapi visual-c++ environment-variables getlasterror

这是我的代码

#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 个答案:

答案 0 :(得分:2)

您必须使用GetLastError,因为您可能会遇到定义没有值的变量的情况。

此类案例可以通过以下方式进行模拟:

SetEnvironmentVariable( "foo", "" );

GetEnvironmentVariable返回0时,可能是变量不存在,或者存在空内容。在后一种情况下,GetLastError返回0.

如果你不关心(即:一个不存在的变量或一个空的变量对你来说是相同的),那么不要打扰GetLastError


旁注。您应该始终使用NULL nSize参数进行第一次调用,如文档所述:

  

如果lpBuffer不足以容纳数据,则返回值为   保存字符串及其所需的缓冲区大小(以字符为单位)   终止空字符和lpBuffer的内容是未定义的。

而且,我刚刚测试过(Windows 7),在这种情况下GetLastError返回0(如果你问我,那就很尴尬)


setting a variable in 7

编辑:在Windows 7上,当我将用户变量设置为“null”时,GetEnvironmentVariable(MBCS)检索的值是一个5字节的字符串'n','u','l',' l','\ 0'


代码(UNICODE构建):

#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;

}