`

《Windows API巡礼》---GetEnvironmentStrings和GetEnvironmentVariable

 
阅读更多

环境变量是进程中一组变量信息,环境变量分为系统环境变量、用户环境变量和进程环境变量。系统有全局的环境变量,在进程创建时,进程继承了系统的全局环境变量、当前登录用户的用户环境变量和父进程的环境变量。进程也可以有自己的环境变量。

设置和获取所在进程的环境变量使用API函数GetEnvironmentStringsGetEnvironmentVariableSetEnvironmentVariable

1GetEnvironmentStrings函数用于获取所有环境变量字符串:

LPTCH WINAPI GetEnvironmentStrings(void);

返回值:

成功时,返回指向保存环境变量的缓冲区;

失败时,返回值为NULL

2FreeEnvironmentStrings函数用来释放由GetEnvironmentStrings返回的内存块:

BOOL WINAPI FreeEnvironmentStrings(

__in LPTCH lpszEnvironmentBlock

);

返回值:

成功时,返回非零值;

失败时,返回零值,可调用GetLastError()查看进一步错误消息。

3GetEnvironmentVariable函数用于获取指定的环境变量:

DWORD WINAPI GetEnvironmentVariable(

__in_opt LPCTSTR lpName, //环境变量名

__out_opt LPTSTR lpBuffer, //指向保存环境变量值的缓冲区

__in DWORD nSize //缓冲区大小(字符数)

);

返回值:

成功时,返回真实的环境变量值大小,不包括null结束符;

如果lpBuffer大小不足,则返回值是实际所需的字符数大小,lpBuffer内容未定义;

失败时,返回0;如果指定的环境变量找不到,GetLastError()返回ERROR_ENVVAR_NOT_FOUND

4SetEnvironmentVariable函数用于设置指定的环境变量:

BOOL WINAPI SetEnvironmentVariable(

__in LPCTSTR lpName, //环境变量名,当该值不存在且lpValue不为NULL时,将创建一个新的

__in_opt LPCTSTR lpValue //环境变量值

);

返回值:

成功时,返回非零值;

失败时,返回零值,调用GetLastError()查看具体的错误信息。

该函数对系统环境变量以及其他进程的环境变量不起作用!

实例一:调用GetEnvironmentStrings函数检索进程的环境变量内存块,并将其中内容打印到控制台:

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

int _tmain()

{

LPTSTR lpszVariable;

LPTCH lpvEnv;

//获得环境变量内存块的指针

lpvEnv = GetEnvironmentStrings();

if(lpvEnv == NULL)

{

printf("GetEnvironmentStrins failed(%d)/n", GetLastError());

return 0;

}

//环境变量字符串是以NULL分隔的,内存块以NULL结尾

lpszVariable = (LPTSTR)lpvEnv;

while(*lpszVariable)

{

_tprintf(TEXT("%s/n"), lpszVariable);

lpszVariable += lstrlen(lpszVariable) + 1; //移动指针

}

FreeEnvironmentStrings(lpvEnv);

system("pause");

return 1;

}

实例二:默认情况下,子进程继承父进程环境变量内存块的一份拷贝;下面代码通过调用CreateProcess函数实现将一个环境变量块传递给子进程(asce.exe就是实例一编译链接得到的exe文件,因此,该代码的运行结果就是子进程打印从父进程继承而来的环境变量):

#include <Windows.h>

#include <tchar.h>

#include <stdio.h>

#include <strsafe.h>

#define BUFSIZE 4096

int _tmain()

{

TCHAR chNewEnv[BUFSIZE];

LPTSTR lpszCurrentVariable;

DWORD dwFlags = 0;

TCHAR szAppName[] = TEXT("asce.exe");

STARTUPINFO si;

PROCESS_INFORMATION pi;

BOOL fSuccess;

//将环境变量字符串拷贝到环境变量内存块中

lpszCurrentVariable = (LPTSTR)chNewEnv;

if(FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("AsceSetting=Luffy"))))

{

printf("String copy failed/n");

return FALSE;

}

lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;

if(FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("AsceVersion=2.0"))))

{

printf("String copy failed/n");

return FALSE;

}

//使环境变量内存块以NULL结尾

lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;

*lpszCurrentVariable = (TCHAR)0;

//创建子进程,指定一个新的环境变量内存块

SecureZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

#ifdef UNICODE

dwFlags = CREATE_UNICODE_ENVIRONMENT;

#endif

fSuccess = CreateProcess(szAppName, NULL, NULL, NULL,

TRUE, dwFlags, (LPVOID)chNewEnv, //新的环境变量内存块

NULL, &si, &pi);

if(!fSuccess)

{

printf("CreateProcess failed(%d)/n", GetLastError());

return FALSE;

}

WaitForSingleObject(pi.hProcess, INFINITE);

system("pause");

return TRUE;

}

实例三:在子进程创建过程中改变子进程的环境变量是一个进程改变另一个进程环境变量的唯一方式。一个进程绝不能直接改变另一个进程(非子进程)的环境变量。下面代码实现子进程继承符进程环境变量的方法:

#include <Windows.h>

#include <tchar.h>

#include <stdio.h>

#define BUFSIZE 4096

#define VARNAME TEXT("AsceVariable")

int _tmain()

{

DWORD dwRet, dwErr;

LPTSTR pszOldVal;

TCHAR szAppName[] = TEXT("asce.exe");

DWORD dwFlags = 0;

STARTUPINFO si;

PROCESS_INFORMATION pi;

BOOL fExist, fSuccess;

// Retrieves the current value of the variable if it exists.

// Sets the variable to a new value, creates a child process,

// then uses SetEnvironmentVariable to restore the original

// value or delete it if it did not exist previously.

pszOldVal = (LPTSTR)malloc(BUFSIZE*sizeof(TCHAR));

if(NULL == pszOldVal)

{

printf("Out of memory/n");

return FALSE;

}

dwRet = GetEnvironmentVariable(VARNAME, pszOldVal, BUFSIZE);

if(0 == dwRet)

{

dwErr = GetLastError();

if(ERROR_ENVVAR_NOT_FOUND == dwErr)

{

printf("Environment variable does not exist/n");

fExist = FALSE;

}

}

else if(BUFSIZE < dwRet)

{

pszOldVal = (LPTSTR)realloc(pszOldVal, dwRet*sizeof(TCHAR));

if(NULL == pszOldVal)

{

printf("Out of memory/n");

return FALSE;

}

dwRet = GetEnvironmentVariable(VARNAME, pszOldVal, dwRet);

if(!dwRet)

{

printf("GetEnvironmentVariable failed(%d)/n", GetLastError());

return FALSE;

}

else

fExist = TRUE;

}

else

fExist = TRUE;

//Set a value for the child process to inherit

if(!SetEnvironmentVariable(VARNAME, TEXT("ASCE")))

{

printf("SetEnvironmentVariable failed(%d)/n", GetLastError());

return FALSE;

}

//Create a child process

SecureZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

#ifndef UNICODE

dwFlags = CREATE_UNICODE_ENVIRONMENT;

#endif

fSuccess = CreateProcess(szAppName, NULL, NULL, NULL,

TRUE, dwFlags, NULL,//inherit parent's environment

NULL, &si, &pi);

if(!fSuccess)

{

printf("CreateProcess failed(%d)/n", GetLastError());

}

WaitForSingleObject(pi.hProcess, INFINITE);

//Restore the original environment variable

if(fExist)

{

if(!SetEnvironmentVariable(VARNAME, pszOldVal))

{

printf("SetEnvironmentVariable failed(%d)/n", GetLastError());

return FALSE;

}

}

else

SetEnvironmentVariable(VARNAME, NULL);

free(pszOldVal);

system("pause");

return fSuccess;

}

分享到:
评论

相关推荐

    获取信息的有关Windows API

    在Windows操作系统中,Windows API(应用程序接口)是开发者获取系统信息、进行系统操作的重要工具。以下将详细讨论如何使用Windows API获取各种信息,包括窗口信息、设备驱动器信息、磁盘信息以及环境变量。 1. **...

    API之网络函数---整理网络函数及功能

    CreateScalableFontResource 为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统 DrawText 将文本描绘到指定的矩形中 DrawTextEx 与DrawText相似,只是加入了更多的功能 ...

    易语言调用API枚举环境变量 非WScript.Shell

    在Windows系统中,`GetEnvironmentStrings` 和 `GetEnvironmentVariable` 是两个常用的API函数。`GetEnvironmentStrings` 返回一个包含所有环境变量的字符串数组,而`GetEnvironmentVariable` 可以用来获取指定环境...

    所有API函数使用下载

    在编程领域,API(Application Programming Interface)是一组预先定义的函数、对象、常量和协议,它们为开发者提供了构建软件或应用程序的工具。在你提到的"所有API函数使用下载"资源中,我们重点关注的是PB8...

    API枚举环境变量-易语言

    1. 导入API:首先,你需要导入相关的API函数,例如在Windows系统中,这可能是`GetEnvironmentVariable`或`EnumEnvironmentStrings`函数,这两个函数分别用于获取单个环境变量和枚举所有环境变量。 2. 函数参数:理解...

    Win32 API 硬件与系统函数.pdf

    Win32 API是一组用于开发基于Microsoft Windows的应用程序的编程接口。本文档主要聚焦于与硬件及系统管理相关的函数,这些函数能够帮助开发者更好地理解如何通过API调用来获取硬件信息,特别是对于那些需要访问底层...

    Windows进程和线程

    进程环境信息是进程执行需要的环境,获取和释放环境信息可以使用 `GetEnvironmentStrings` 和 `FreeEnvironmentStrings` 函数。获取环境变量可以使用 `GetEnvironmentVariable` 函数,设置环境变量可以使用 `Set...

    VB获取各种windows目录.rar

    - 对于更复杂的目录,如网络路径或者自定义的注册表值指向的目录,可能需要使用API函数,如`GetEnvironmentVariable`或`SHGetKnownFolderPath`。例如,获取用户的桌面目录,可以调用`SHGetSpecialFolderPath` API。...

    环境变量查看器(WIN32)

    本项目名为“环境变量查看器(WIN32)”,显然是一个利用WIN32 API来实现的工具,用于查看和可能修改Windows系统中的环境变量。这个程序特别适用于开发者和系统管理员,他们经常需要检查或调整环境变量来解决配置问题...

    易语言-易语言调用API枚举环境变量 非WScript.Shell

    枚举环境变量的API函数通常是`GetEnvironmentVariable`和`SetEnvironmentVariable`,但在这里我们关注的是获取所有环境变量,这需要使用`GetEnvironmentStrings`和`FreeEnvironmentStrings`两个API函数。 `...

    Windows脚本编程核心技术精解中文版卷六

    - Windows注册表是存储系统配置信息的地方,脚本可以通过`WScript.Shell.RegRead`和`WScript.Shell.RegWrite`方法读写注册表项。 - 这种能力使得脚本能够更改系统设置或读取重要信息。 **4.2 系统信息查询** - 通过...

    Java环境变量设置工具VS2005源代码

    - 可能还会有专门的类或函数用于读写系统环境变量,如`GetEnvironmentVariable`和`SetEnvironmentVariable`API的封装。 - 另外,源代码可能还包括资源文件(`.rc`),定义了界面元素如按钮、文本框等。 5. **开发...

    获取“System”文件夹的位置的资源

    在Windows操作系统中,“System”文件夹是一个至关重要的系统组件,包含了大量的系统文件、动态链接库(DLLs)、驱动程序和其他支持系统运行的组件。获取“System”文件夹的位置是进行系统维护、软件安装或编程时...

    Java环境变量设置工具Delphi版源码.rar

    这可能涉及到Windows API调用,如`SetEnvironmentVariable`和`GetEnvironmentVariable`函数,以及可能的用户界面元素,如文本框、按钮和对话框,用于交互式设置环境变量。 4. **开发环境的搭建**: - 开发和运行这...

    aaa.rar_C Builder

    例如,`System::SysUtils::GetEnvironmentVariable`可以获取环境变量,`System::Windows::Forms::Screen`类提供了屏幕分辨率等信息。 三、编写客户端程序 创建一个C++Builder项目后,可以在主窗体的`OnCreate`事件...

    易语言设置控件边框模块

    总的来说,这个易语言设置控件边框模块利用了Windows API函数,实现了对控件边框的灵活控制,使开发者能够创建更加个性化和符合用户需求的软件界面。通过深入理解并运用这些API,可以提高应用程序的用户体验,并展现...

    WinAPI (Delphi版)

    GetEnvironmentStrings GetEnvironmentVariable GetLocaleInfo GetLocalTime GetLogicalDrives GetLogicalDriveStrings GetStartupInfo GetSystemDefaultLangID GetSystemDefaultLCID ...

    操作系统和环境平台信息OperatingSystemDemo

    - `GetEnvironmentVariable` 和 `SetEnvironmentVariable`:分别用于获取和设置环境变量的值。 - `TickCount`:获取自操作系统启动以来经过的毫秒数,用于计时和性能测试。 4. **多平台支持**: 在跨平台开发中...

    获取Windows环境变量,Delphi

    Delphi是一款强大的Windows应用程序开发工具,它提供了访问系统环境变量的API函数和组件。 在Delphi中,我们可以使用内置的`SysUtils`单元来获取和操作环境变量。`SysUtils`单元包含了`GetEnvironmentVariable`和`...

Global site tag (gtag.js) - Google Analytics