0

这是我的代码

#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")
4

1 回答 1

2

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

这种情况可以用以下方式模拟:

SetEnvironmentVariable( "foo", "" );

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

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


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

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

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


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

}
于 2014-03-18T18:35:36.937 回答