好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 mxwawaawxm 于 2022-8-29 07:24 编辑
大致的功能:修改环境变量path的值,在后面附加新的路径(变量名是szEnvNewValue,我添加的路径是d:\\Program Files\\learn\\C)
第1步,调用GetEnvironmentVariable函数GetEnvironmentVariable(lpName, NULL, 0),获取path值的长度,然后调用HeapAlloc函数分配内存块szMemEnv。
第2步,计算原有path的值加上分隔符;和新路径的长度,再调用HeapReAlloc函数动态扩充内存块。然后,在内存块上,调用_tcscat_s函数依次附加分隔符、待添加的新路径。
_tcscat_s(szMemEnv, dwEnvNewChars, ";");
这里添加分隔符,我特意调用_tprintf函数,打印内存块的大小、字符串的长度及字符串,正确无误
但在_tcscat_s(szMemEnv, dwEnvNewChars, szEnvNewValue)出错
我调用_tprintf函数,打印字符串的长度为0,字符串显示为空字符串。
请问大佬们,是哪里出错了。
代码如下
[C] 纯文本查看 复制代码 #include <windows.h>
#include <tchar.h>
#define PATHFILENAME "path"
LPTSTR GetEnvValue(LPCTSTR lpName);
void AppendEnv(LPTSTR szMemEnv, LPCTSTR lpName, LPCTSTR szEnvNewValue);
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
// 环境变量“path”的值
LPTSTR szMemEnv;
// 获取环境变量“path”的值
szMemEnv = GetEnvValue(PATHFILENAME);
// 在环境变量path后添加新路径
AppendEnv(szMemEnv, "path", "d:\\Program Files\\learn\\C");
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv);
return 1;
}
/* 获取环境变量“path”的值 */
LPTSTR GetEnvValue(LPCTSTR lpName)
{
// GetEnvironmentVariable结果标志
DWORD dwGetEnvFlag;
LPTSTR szMemEnv;
// 获取环境变量“path”的值的字符数(包含结束\0空字符)
DWORD dwSize = GetEnvironmentVariable(lpName, NULL, 0);
// 分配内存
szMemEnv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize*sizeof(TCHAR));
if (szMemEnv==NULL) {
_tprintf(TEXT("HeapAlloc分配内存%s失败:%lu。\n"), lpName, GetLastError());
exit(1);
}
dwGetEnvFlag = GetEnvironmentVariable(lpName, (LPTSTR)szMemEnv, dwSize*sizeof(TCHAR));
if (dwGetEnvFlag==0) {
_tprintf(TEXT("GetEnvironmentVariable获取环境变量%s失败:%lu。\n"), lpName, GetLastError());
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv);
exit(1);
}
_tprintf(TEXT("\n\n----------------------系统环境变量%s---------------------\n"), lpName);
_tprintf(TEXT("环境变量%s的值:%s\n"), lpName, (LPTSTR)szMemEnv);
_tprintf(TEXT("----------------------系统环境变量%s---------------------\n\n"), lpName);
return szMemEnv;
}
/* 在环境变量path后添加新路径 */
void AppendEnv(LPTSTR szMemEnv, LPCTSTR lpName, LPCTSTR szEnvNewValue)
{
// 新字符数:szMemEnv + ; + szEnvNewValue
DWORD dwEnvNewChars = _tcslen(szMemEnv)+_tcslen(szEnvNewValue)+_tcslen(";");
// 新字节数:szMemEnv + ; + szEnvNewValue + \0
DWORD dwEnvNewBytes = (dwEnvNewChars+1) *sizeof(TCHAR);
// SetEnvironmentVariable函数执行结果标志
BOOL bSetEnvFlag;
szMemEnv = (LPTSTR)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv, dwEnvNewBytes);
if (szMemEnv == NULL) {
_tprintf(TEXT("HeapReAlloc扩充内存失败:%lu。\n"), GetLastError());
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv);
} else {
_tprintf(TEXT("\n%I64u %I64u %s\n"), HeapSize(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv), _tcslen(szMemEnv), szMemEnv);
// 附加分隔符
_tcscat_s(szMemEnv, dwEnvNewChars, ";");
_tprintf(TEXT("\n%I64u %I64u %s\n"), HeapSize(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv), _tcslen(szMemEnv), szMemEnv);
// 附加新路径
_tcscat_s(szMemEnv, dwEnvNewChars, szEnvNewValue);
_tprintf(TEXT("\n%I64u %I64u %s\n"), HeapSize(GetProcessHeap(), HEAP_ZERO_MEMORY, szMemEnv), _tcslen(szMemEnv), szMemEnv);
bSetEnvFlag = SetEnvironmentVariable(lpName, szMemEnv);
if (bSetEnvFlag==0) {
_tprintf(TEXT("SetEnvironmentVariable设置环境变量失败:%lu。\n"), GetLastError());
} else {
_tprintf(TEXT("\n\n成功在环境变量\"%s\"后添加新值\"%s\"。\n"), lpName, szEnvNewValue);
}
}
} |
|