Winapi 在不使用GetLastError()的情况下检查环境变量==在VC+中找不到ERROR_ENVVAR+;
这是我的密码Winapi 在不使用GetLastError()的情况下检查环境变量==在VC+中找不到ERROR_ENVVAR+;,winapi,visual-c++,environment-variables,getlasterror,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()==
#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;
}
您必须使用
GetLastError
,因为您可能会遇到变量定义为无值的情况
可通过以下方式模拟此类情况:
SetEnvironmentVariable( "foo", "" );
当GetEnvironmentVariable
返回0时,可能是该变量不存在,或者该变量的内容为空。在后一种情况下,GetLastError
返回0
如果您不在乎(即:一个不存在的变量或一个空变量对您来说是一样的),那么就不要为GetLastError
而烦恼
旁注。您应该始终使用NULL nSize参数进行第一次调用,如文档所述: 如果lpBuffer不够大,无法容纳数据,则返回值为 保存字符串及其字符串所需的缓冲区大小(以字符为单位) 终止空字符和lpBuffer的内容未定义 我刚刚测试了(Windows7),在这种情况下,
GetLastError
返回0(如果你问我的话,很尴尬)
编辑:在Windows 7上,当我将用户变量设置为“null”时,
GetEnvironmentVariable
(MBCS)检索到的值是一个5字节的字符串“n”、“u”、“l”、“l”、“0”
代码(UNICODE构建):
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
#定义bufsize4602
#定义VARNAME L“zzz”
常量wchar_t*MyGetEnv(常量wchar_t*pszVarName,wchar_t*pszVarValue,
尺寸(CBT值){
DWORD DWCOPYED=GetEnvironmentVariable(pszVarName、pszVarValue、cbValue);
//如果你真的这么想,下面的行可能会被注释掉
//不喜欢GETLASTERROR,因为对于
//不存在变量
如果(GetLastError()!=NO_ERROR)返回NULL;//不存在,或返回错误
如果(dwCopied==0)返回NULL;//var为空
返回pszVarValue;
}
int main(){
wchar_t szVarValue[BUFSIZE];
const wchar_t*pszVarValue=MyGetEnv(VARNAME,szVarValue,
_countof(szVarValue));
if(pszVarValue==NULL){
printf(“无变量或空值”);
}else if(_wcsicmp(pszVarValue,L“null”)==0)||
(_wcsicmp(pszVarValue,L“nul”)==0)){
printf(“特殊的'null'或'nul'值\n”);
}否则{
wprintf(L“值为%s\n”,szVarValue);
}
返回0;
}
为什么需要在没有GetLastError的情况下执行此操作?我需要它检查是否有人将变量值设置为“NULL”或“NULL”,好的。那么,为什么不使用GetLastError就需要这样做呢?否如果该值为null,则GetLastError不会返回ERROR\u ENVVAR\u NOT\u FOUND rite?因为环境变量是带有value@user3275057你们读过我的答案了吗?你们所说的环境变量存在且内容为空是什么意思。我无法创建内容为空的环境(我无法在窗口中单击“确定”)。当我创建一个值为单空格(“”)或“null”的变量时,GetEnvironmentVariable没有返回零请重新阅读我的答案。使用SetEnvironmentVariable(“foo”和“”)代码>允许您使用空内容定义环境变量。GetEnvironmentVariable
和GetLastError
都将返回0。不,我不想通过SetEnvironmentVariable(“foo”)设置环境变量。
我需要通过MyComputer>Properties>EnvironmentVariable
进行设置,然后再试。例如,首先调用SetLastError(42)
,然后尝试获取一个空变量GetLastError()
返回42
。或者尝试获取一个不存在的变量,然后获取一个空变量,然后调用GetLastError()
。文档只提到了如果找不到指定的环境变量,在GetLastError()
上会发生什么,而没有提到成功时会发生什么。@johv o_o你是对的,所以我错了。今天我学到了一些东西,谢谢!(我认为这是GetEnvironmentVariable
实现中的一个BUG,或者GetEnvironmentVariable
文档中的一个BUG)
SetEnvironmentVariable( "foo", "" );
#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;
}