ex1
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #include <iostream> #define BUFSIZE 4096 int _tmain() { TCHAR chNewEnv[BUFSIZE]; LPTSTR lpszCurrentVariable; DWORD dwFlags = 0; TCHAR szAppName[] = TEXT("E:\\TEST\\wincode\\ex1\\Debug\\ex3.exe"); STARTUPINFO si; PROCESS_INFORMATION pi; BOOL fSuccess; // Copy environment strings into an environment block. lpszCurrentVariable = (LPTSTR)chNewEnv; if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MySetting=A")))) { printf("String copy failed\n"); return FALSE; } lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1; if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MyVersion=2")))) { printf("String copy failed\n"); return FALSE; } // Terminate the block with a NULL byte. lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1; *lpszCurrentVariable = (TCHAR)0; // Create the child process, specifying a new environment block. 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, // new environment block NULL, &si, &pi); if (!fSuccess) { printf("CreateProcess failed (%d)\n", GetLastError()); DWORD err = GetLastError(); std::cout << err << "\n"; return FALSE; } WaitForSingleObject(pi.hProcess, INFINITE); system("pause"); return TRUE; }
ex2
#include <windows.h> #include <tchar.h> #include <stdio.h> #define BUFSIZE 4096 #define VARNAME TEXT("MyVariable") int _tmain() { DWORD dwRet, dwErr; LPTSTR pszOldVal; //TCHAR szAppName[] = TEXT("ex3.exe"); TCHAR szAppName[] = TEXT("E:\\TEST\\wincode\\ex1\\Debug\\ex3.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("Test"))) { printf("SetEnvironmentVariable failed (%d)\n", GetLastError()); return FALSE; } // Create a child process. SecureZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); #ifdef 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); return fSuccess; }
ex3
#include <windows.h> #include <tchar.h> #include <stdio.h> int _tmain() { LPTSTR lpszVariable; LPTCH lpvEnv; // Get a pointer to the environment block. lpvEnv = GetEnvironmentStrings(); // If the returned pointer is NULL, exit. if (lpvEnv == NULL) { printf("GetEnvironmentStrings failed (%d)\n", GetLastError()); return 0; } // Variable strings are separated by NULL byte, and the block is // terminated by a NULL byte. lpszVariable = (LPTSTR)lpvEnv; while (*lpszVariable) { _tprintf(TEXT("%s\n"), lpszVariable); lpszVariable += lstrlen(lpszVariable) + 1; } FreeEnvironmentStrings(lpvEnv); return 1; }