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

(35)远程识别(又称无人机识别)(一) Ardupilot官网关于《Peripheral Hardware》的翻译 —《(35) 远程识别(又称无人机识别)》。 阅读详情

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

设置和获取所在进程的环境变量使用API函数GetEnvironmentStrings、GetEnvironmentVariable和SetEnvironmentVariable:

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

LPTCH WINAPI GetEnvironmentStrings(void);

返回值:

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

失败时,返回值为NULL。

 

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

BOOL WINAPI FreeEnvironmentStrings(

  __in  LPTCH lpszEnvironmentBlock

);

返回值:

成功时,返回非零值;

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

 

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

DWORD WINAPI GetEnvironmentVariable(

  __in_opt   LPCTSTR lpName, //环境变量名

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

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

);

返回值:

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

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

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

 

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

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;

}

openpi 入门教程(二)droid libero 训练、推理 OpenPI是由物理智能团队发布的机器人领域开源模型与软件平台,提供基于流扩散式(π₀)和自回归式(π₀-FAST)两类视觉-语言-动作模型。平台支持在DROID、ALOHA、UR5等多种机器人系统上部署,包含预训练检查点(1万+小时数据)和微调示例。文档详细说明了各平台部署流程:DROID需启动策略服务器并配置摄像头;ALOHA提供真实机器人任务(取吐司、叠毛巾等)的检查点和场景设置建议;UR5示例展示自定义数据转换方法。实验性验证显示π₀-FAST在LIBERO基准测试中平均得分85.5。平台强调模型适 阅读详情

相关推荐

tiktok算法协议研究

经过上述分析,可以确定目标字符串来源于一段 JSON 数据,而这段 JSON 数据来自于一个经过加密的本地文件。对字符串 "sdi_v2" 进行 SHA-1 计算,得到 20 字节的结果;将第一步得到的数据进行MD5计算,生成16字节的结果;将第二步的结果转换为十六进制字符串,从而得到 32 字节的密钥。写这种算法分析的帖子真的是太无聊了,就先分析到这里吧,后续有机会再来谈下被加密的本地文件是怎么来的!!自我感觉TT的算法并不难,就是量太大了,所以我想问问有没有感兴趣的朋友来一起分析,欢迎联系。

2503_90751938的博客 2574

GetEnvironmentVariable 获取系统环境变量

常用的系统环境变量有: WINDIR: //系统目录 - C:\WINDOWS SYSTEMROOT: //系统目录 - C:\WINDOWS SYSTEMDRIVE: //系统根目录 - C: HOMEDRIVE: //当前用户根目录 - C: USERPROFILE: //当前用户目录 - C:\Users\Kandy HOMEPATH:

HelloKandy's Blog 1万+

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)

本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。

yegu001的博客 4939

C#中环境变量

环境变量是操作系统中存储的一种机制,用于保存与操作系统环境和应用程序运行相关的配置信息。它们是一组键值对,其中每个键都对应一个特定的配置项,而键对应的值则是该配置项的具体数值。环境变量可以在操作系统级别设置,对所有用户和应用程序可见,并在整个系统的生命周期中保持不变。它们提供了一种方便的方式来存储和访问与操作系统设置、路径、用户首选项等相关的信息。PATH:指定操作系统在执行命令时搜索可执行文件的路径。HOME:指定当前用户的主目录路径。USERNAME:指定当前用户的用户名。TEMP或TMP。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 3209

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 264

02.1 知识图谱工具 Protege的下载安装与使用

Protege的下载安装与使用 本文是王昊奋老师《知识图谱》系列笔记第2.1篇。 文章目录Protege的下载安装与使用0 相关介绍0.0 Protege相关介绍0.1 Protégé的特点0.2 Protégé的用途1 Protege的下载1.1 准备工作:安装配置JAVA环境1.2 官网下载2 Protege的安装2.1 直接解压缩2.2 双击运行3 Protege的使用实例-创建类...

和而不流 7万+

59.环境变量GetEnvironmentStrings、FreeEnvrionmnetStrings、GetEnvironmentVariable、SetEnvironmentVariable

GetEnvironmentStrings获取所有环境变量 返回值为系统环境变量的指针 WINBASEAPI LPSTR WINAPI GetEnvironmentStrings(VOID); GetEnvironmentVariable获取指定名称的变量名的值 WINBASEAPI DWORD WINAPI GetEnvironmentVariableA( LPCSTR _in lpName,...

单于的学习历程 1278

NSGA(非支配排序遗传算法)

在多目标优化问题中,往往存在多个相互冲突的目标需要同时优化。传统的单目标优化算法无法直接应用于这类问题,因此需要专门的多目标优化算法。非支配排序遗传算法(Non-dominated Sorting Genetic Algorithm,NSGA)是一种经典的多目标优化算法,由印度科学家 Kalyanmoy Deb 等人于 1995 年提出。NSGA 通过非支配排序和拥挤度距离来引导种群向 Pareto 最优前沿进化,从而得到一组具有良好分布性和收敛性的 Pareto 最优解。

2969

修改环境变量(GetEnvironmentVariable、SetEnvironmentVariable、GetEnvironmentStrings)

Each process has an environment block associated with it.The environment block consists of a null-terminated block of null-teminated strings (meaning there are two bytes at the end of the block),wher...

zhangge3663的博客 1624

手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计

目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波

MHD0815的博客 888

用Playwright MCP让AI帮你完成所有浏览器自动化

Playwright MCP(Model Context Protocol)是微软基于 Playwright 框架推出的 AI 浏览器自动化新协议。它通过结构化快照数据和自然语言指令结合大型语言模型(如 GPT),实现无需编码的网页交互。无论你是要测试登录流程、抓取价格数据,还是用 AI 远程控制浏览器,Playwright MCP 都能大幅降低门槛,让“说人话”也能驱动自动化脚本。本篇将从功能介绍、技术架构、使用方法到实际场景,带你全面理解这一自动化革命。

todoitbo的博客 3万+

windows vis c++/GetEnvironmentStrings 如何获取打开进程的环境变量字符串

#include "stdafx.h" #include #include #include #include using namespace std; void DumpEnvStrings(); int _tmain(int argc, _TCHAR* argv[]) // { STARTUPINFO si={sizeof(si)}; PROCESS_INFORM

小知识折射大智慧 2546

绕过Cloudflare的两种简便方案

绕过Cloudflare的两种简便方案

自成背后的博客 1万+

设置和获取所在进程的环境变量

转载网址:http://hi.baidu.com/code_tin/item/244219505b567b9309be1796 设置和获取所在进程的环境变量,使用API函数 GetEnvironmentStrings,GetEnvironmentVariable和SetEnvironmentVariable等. 1.GetEnvironmentStrings GetEnviro

shuaiby的专栏 6130

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用 GetEnvironmentVariable 获取常用系统环境变量

以前曾用 GetWindowsDirectory、GetSystemDirectory、GetTempPath 等函数获取系统常用文件夹; 也用过 SHGetSpecialFolderLocation、SHGetPathFromIDList 函数获取过更多常用路径; 但这都不如用 GetEnvironmentVariable 获取系统变量来得快. //譬如 %WINDIR...

weixin_34064653的博客 364

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Windows系统编程——进程篇:获取环境变量

本文对比了Windows和Linux系统下获取环境变量的方法。在Windows系统中,可以通过GetEnvironmentStrings获取环境变量块,该块以\0分隔的name=value字符串组成,最后以双空字符结束。文章详细介绍了如何遍历、拆分这些变量,并存储到STL容器如std::map和std::vector中。同时指出Windows对字符编码的特殊处理,建议不要直接修改环境变量块。Linux系统则通过environ全局变量获取环境变量,采用C运行时库的方式实现。两种系统在环境变量处理上存在明显差异

charlie114514191的博客 1149

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Windows提取环境变量

每个进程都有一个与它关联的环境块,这是在进程地址空间内分配的一块内存。每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值,注意:除了第一个=::=::\字符串,块中可能还有其他字符串是以(=)开头的。这种字符串不能作为环境变量的使用。调用GetEnvironmentStrings函数来获取完整的环境块。...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1847

进程的环境变量

环境变量是进程中一组变量信息,环境变量分为系统环境变量、用户环境变量和进程环境变量。系统有全局的环境变量,在进程创建时,进程继承了系统的全局环境变量、当前登录用户的用户环境变量和父进程的环境变量。进程也可以有自己的环境变量。设置和获取所在进程的环境变量使用函数GetEnvironmentStrings、GetEnvironmentVariable和SetEnvironmentVariable:

小米的修行之路 1740

[C++]《Windows核心编程》读书笔记

这篇笔记是我在读《Windows核心编程》第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的。开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯。  海量细节。第1章    错误处理1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖

henreash的专栏 5209

获取环境变量 getenv小心有坑!

getenv这个函数在P/Invoke中会有同进程的环境变量获取问题,建议win环境下,还是不要使用该函数。本文将详细介绍对这个问题打得探索

小黑同学的博客 1711

GetEnvironmentVariable 获取常用系统变量(转)

源:GetEnvironmentVariable 获取常用系统变量 //譬如 WINDIR 表示系统目录系统变量, 以这样获: var s:string; begin s:=GetEnvironmentVariable('WINDIR'); ShowMessage(s);{C:WINDOWS} end; (*---------------------...

weixin_34166847的博客 700

用 GetEnvironmentVariable 获取系统变量

GetEnvironmentVariable 获取系统变量 DWORD WINAPI GetEnvironmentVariable(   __in_opt   LPCTSTR lpName, //环境变量名   __out_opt  LPTSTR lpBuffer, //接收的得到的路径的buffer   __in       DWORD nSize //buffer大小 ); 失

Lydia的博客 6236

漫谈环境变量

不管是日常开发还是使用电脑的过程中,我们几乎无法避免与环境变量打交道,这是因为环境变量在系统的运行中发挥着不可或缺的作用,它作为系统的运行时参数,保存了一些进程运行时所需的信息。如上图所示,当系统环境变量、用户环境变量、进程环境变量中存在相同名称的环境变量时该如何取舍呢,很显然,进程环境变量会覆盖用户环境变量,用户环境变量会覆盖系统环境变量。区别于系统环境变量和用户环境变量,它的作用域更小,它只在进程内有效。一般的,父进程在创建子进程的时候,如果不指定环境变量,那么子进程将继承父进程的环境变量。

weixin_38526093的博客 2617
上一篇: 《Windows API巡礼》---GetCurrentDirectory和GetModuleFileName
下一篇: 《Windows API巡礼》--CreateRemoteThread和WriteProcessMemory
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值