4.进程_2(进程的环境变量)
1.WinMain第二个参数是用于16位操作系统的,现在不使用. “parameter not referenced”警告可利用UNREFERENCED_PARAMETER宏来消除。
2.进程的命令行
3.进程环境变量
1 //进程的环境变量 2 void DumpEnvStrings() { 3 4 PTSTR pEnvBlock = GetEnvironmentStrings(); 5 6 TCHAR szName[MAX_PATH]; 7 TCHAR szValue[MAX_PATH]; 8 PTSTR pszCurrent = pEnvBlock; 9 HRESULT hr = S_OK; 10 PCTSTR pszPos = NULL; 11 int current = 0; 12 13 while (pszCurrent!=NULL) 14 { 15 if (pszCurrent!=NULL) { 16 pszPos = _tcschr(pszCurrent,TEXT('=')); 17 ///加一,跳过= 18 pszPos++; 19 20 size_t cbNameLength = (size_t)pszPos - (size_t)pszCurrent - sizeof(TCHAR); 21 22 hr = StringCbCopyN(szName, MAX_PATH, pszCurrent, cbNameLength); 23 if (FAILED(hr)) { 24 break; 25 } 26 hr = StringCchCopyN(szValue,MAX_PATH,pszPos,_tcslen(pszPos)+1); 27 if (SUCCEEDED(hr)) { 28 _tprintf(TEXT("[%u] %s = %s \r\n"),current,szName,szValue); 29 }else //... 30 31 if (hr == STRSAFE_E_INSUFFICIENT_BUFFER) { 32 _tprintf(TEXT("[%u] %s = %s...\r\n"),current,szName,szValue); 33 } 34 else { 35 _tprintf(TEXT("[%u] %s=???\r\n"),current,szName); 36 break; 37 } 38 39 } 40 else { 41 _tprintf(TEXT("[%u] %s \r\n "), current, szName); 42 } 43 44 current++; 45 while (*pszCurrent!=TEXT('\0')) 46 { 47 pszCurrent++; 48 } 49 pszCurrent++; 50 51 if (*pszCurrent == TEXT('\0')) { 52 break; 53 } 54 } 55 FreeEnvironmentStrings(pEnvBlock); 56 } 57 58 void DempEnvVariables(PTSTR pEnvBlock[]) { 59 int current = 0; 60 PTSTR* pElement = (PTSTR*)pEnvBlock; 61 PTSTR pCurrent = NULL; 62 while (pElement!=NULL) 63 { 64 pCurrent = (PTSTR)(*pElement); 65 if (pCurrent==NULL) { 66 pElement = NULL; 67 } 68 else { 69 _tprintf(TEXT("[%u] %s\r\n"), current, pCurrent); 70 current++; 71 pElement++; 72 } 73 } 74 } 75 //wmain 是unicode类型,argv类型也就是unicode,否则是ansi 76 int wmain(int argc,TCHAR* argv[],TCHAR* env[]) 77 { 78 //设置本地 79 setlocale(LC_CTYPE, ""); 80 /* //进程命令行 81 int nNumArgs; 82 ///0x005a26e0 {0x005a26e8 L"H:\\2020-2021\\Windows核心编程\\Windows核心编程\\Debug\\4.进程.exe"} 83 PWSTR* ppArgv = CommandLineToArgvW(GetCommandLineW(), &nNumArgs); 84 85 */ 86 /* 87 DumpModule();//基地址 88 */ 89 DumpEnvStrings(); 90 DempEnvVariables(env); 91 getchar(); 92 return 0; 93 }
后一个方法省略了以=号开头的无效字符串。
前一个方法运行结果如下:

4.GetEnviromentVariable ExpandEnviromentStrings SetEnviromentVariable
1 //即PCTSTR中的C表示const,该指针是指向const的指针,它所指向的内容不能被修改。 2 void PrintEnviromentVariable(PCTSTR pszVariableName) { 3 PTSTR pszValue = NULL; 4 DWORD dwResult = GetEnvironmentVariable(pszVariableName,pszValue,0);//填写0,让该函数返回所需字符数量 5 if (dwResult != 0) { 6 DWORD size = dwResult * sizeof(TCHAR); 7 pszValue = (PTSTR)malloc(size); 8 GetEnvironmentVariable(pszVariableName,pszValue,size); 9 _tprintf(TEXT("%s=%s\r\n"),pszVariableName,pszValue); 10 free(pszValue); 11 } 12 else { 13 _tprintf(TEXT("'%s' = <unknow value>\n",pszVariableName)); 14 } 15 }
ExpandEnviromentStrings SetEnviromentVariable 默认改变的都是当前,而不是系统环境变量====》目前还不知道如何修改系统

浙公网安备 33010602011771号