• Changing Environment Variables


    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;
    }
    

      

  • 相关阅读:
    NOIP模拟测试7
    BigInt类
    bzoj 2733 [HNOI2012]永无乡 并查集+平衡树
    bzoj 2752 [HAOI2012]高速公路(road) 线段树
    bzoj 1584 Cleaning Up 打扫卫生 dp
    201709 半集训
    [SHOI2014]概率充电器 dp
    NOIP2016 天天爱跑步
    [HNOI2011] 数学作业
    [Poi2012]Festival
  • 原文地址:https://www.cnblogs.com/chunyou128/p/16002221.html
Copyright © 2020-2023  润新知