这是我的代码
#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")
答案 0 :(得分:2)
您必须使用GetLastError
,因为您可能会遇到定义没有值的变量的情况。
此类案例可以通过以下方式进行模拟:
SetEnvironmentVariable( "foo", "" );
当GetEnvironmentVariable
返回0时,可能是变量不存在,或者存在空内容。在后一种情况下,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;
}