您必须使用GetLastError
,因为您可能会遇到定义变量时没有值的情况。
这种情况可以用以下方式模拟:
SetEnvironmentVariable( "foo", "" );
返回 0时GetEnvironmentVariable
,可能是该变量不存在,或者存在但内容为空。在后一种情况下,GetLastError
返回 0。
如果你不在乎(即:一个不存在的变量或一个空的变量对你来说是一样的),那么不要打扰GetLastError
.
边注。您应该始终使用 NULL nSize 参数进行第一次调用,如文档所述:
如果 lpBuffer 不足以容纳数据,则返回值是缓冲区大小,以字符为单位,需要容纳字符串及其终止空字符,并且 lpBuffer 的内容未定义。
而且,我刚刚测试过(Windows 7),在这种情况下GetLastError
返回 0(如果你问我,很尴尬)

编辑:在 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;
}