2011-04-08 3 views
3

새로운 자식 프로세스를 만들기위한 창에서 CreateProcess 함수를 사용하고 있습니다 :Windows에서 동일한 환경 변수와 부모 환경을 동시에 처리하는 방법은 무엇입니까?

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    __in_opt  LPSECURITY_ATTRIBUTES lpProcessAttributes, 
    __in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    __in   BOOL bInheritHandles, 
    __in   DWORD dwCreationFlags, 
    __in_opt  LPVOID lpEnvironment, 
    __in_opt  LPCTSTR lpCurrentDirectory, 
    __in   LPSTARTUPINFO lpStartupInfo, 
    __out  LPPROCESS_INFORMATION lpProcessInformation 
); 

여기서 CreateProcess은 새로운 프로세스의 환경 변수를 지정하는 lpEnvironment 매개 변수를 가져올 수 있으며 자식이 같은 환경을 가질 것입니다. 현물처럼. 이제 lpEnvironment에서 지정된 parallel plus environment vars와 동일한 환경 (예 : 상위 프로세스와 지정된 환경의 병합 환경)을 갖기를 바랍니다. 이것을 어떻게 제안 하시겠습니까? 부모님의 모든 env를 가져 와서 새 부모와 합치고 CreateProcess에 모두 전달해야합니까?

+0

예. 그렇습니다. – harper

답변

0

사용 getenv는 CRT ENV가 자신을 추가 얻고

+0

하지만 envs가 실제로 있는지 모르는 경우 어떻게 getenv()를 사용할 수 있습니까? –

+0

환경 테이블에 varname이 없으면 반환 값은 NULL입니다. 특정 가치에 관심이 있다면 토큰 화하고 – cprogrammer

+0

을 비교하십시오. 모든 env를 얻는 데 관심이 있습니다. 이 경우 getenv가 나를 도울 것이라고 생각하지 않습니다. –

3

을 설정하는 당신이 바른 길에 생각합니다. 기존 env 블록을 가져 와서 새로운 것을 추가하고 CreateProcess 함수에 전달한 다음 새 env 블록을 삭제하십시오.

현재 블록을 얻으려면 GetEnvironmentStrings. 새로운 변수를 추가하면 간단한 문자열 조작으로 할 수 있습니다. 환경 블록은 단순히 NULL 종료 문자열의 연속적인 시퀀스이며, 마지막에 double null을 가지고 있습니다 (here). 새 env 변수를 추가하거나 기존 env 변수가 이미 정의되어있는 경우이를 갱신하려는 경우 먼저 점검해야 할 수 있습니다.

관련 문제