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 }
View Code

ExpandEnviromentStrings  SetEnviromentVariable 默认改变的都是当前,而不是系统环境变量====》目前还不知道如何修改系统

 

posted @ 2020-07-08 13:34  a1094426901  阅读(111)  评论(0)    收藏  举报