Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 在不使用GetLastError()的情况下检查环境变量==在VC+中找不到ERROR_ENVVAR+;_Winapi_Visual C++_Environment Variables_Getlasterror - Fatal编程技术网

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;

}