2011-07-01 2 views
0

CreateProcessAsUser 함수를 호출하려고합니다. 전달하는 상수 문자열은 괜찮습니다. char * getenv (const char name)를 사용하여 환경 변수를 선택하려고하면 문제가 발생합니다.C++ LPTSTR 문제 CreateProcessAsUser with getenv

다음을 사용하면 notepad.exe가 실행됩니다.

CreateProcessAsUser(hTokenDup, _T("c:\\windows\\notepad.exe"), 
        _T("c:\\windows\\notepad.exe"), NULL, NULL, FALSE, 
        dwCreationFlag, pEnvironment, NULL, &si, &pi); 

그러나 다음을 사용하면 아무 것도 실행되지 않습니다.

CreateProcessAsUser(hTokenDup, _T("MyAppName"), 
        (LPTSTR)getenv("MYENVVAR"), NULL, NULL, FALSE, 
        dwCreationFlag, pEnvironment, NULL, &si, &pi); 

getenv 및 (LPTSTR)을 올바르게 지정 했습니까?

나는 c : \\ windows \\ notepad.exe 및 c : \ windows \ notepad.exe를 포함하는 사용자 및 시스템 환경 변수를 사용하여 시도했다.

감사합니다.

+4

'(LPTSTR) '에 대한 캐스트를 없애십시오. 컴파일러가 캐스트없이 에러 메시지를 보내면 컴파일러를 닫으려고 캐스트를 삽입하는 것은 ** 잘못된 일입니다 **. 컴파일러가 당신에게 뭔가를 말하려고합니다. 이 경우 유니 코드 응용 프로그램을 컴파일하고 유니 코드 문자열이 필요할 때 ANSI 문자열을 전달하려고합니다. ['_tgetenv'] (http://msdn.microsoft.com/en-us/) 라이브러리/tehxacec.aspx) 대신'getenv'를 사용하십시오. –

+0

'getenv'가 성공했는지 알고 있습니까? –

+1

@Adam Rosenfield : [ "컴파일러가 매개 변수를 변환 할 수 없으므로 일부 도움을주고 앞에 캐스트를 붙여 놓으십시오. 컴파일러가 너무 멍청합니다."] (http : /blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx) –

답변

2

lpCommandLineLPTSTR이며 쓰기 가능한 메모리 여야합니다. CreateProcessAsUser을 호출하기 전에 명령 행을 쓰기 가능한 문자열로 복사해야합니다.

문서 getenv에 대한 상태 :

반환 된 포인터를 사용하여 환경 변수의 값을 수정하는 데 안전하지 않습니다.

그러므로 매개 변수를 CreateProcessAsUser으로 전달할 수 없습니다.

처음으로 CreateProcessAsUser을 호출하면 lpCommandLine의 쓰기 가능한 메모리를 전달하지 않으므로 잘못된 것 같습니다.

물론 가장 큰 문제는 ANSI와 유니 코드를 혼합한다는 것입니다. 앱이 유니 코드 인 경우 동일한 소스에서 ANSI와 유니 코드를 모두 타겟팅하려면 _wgetenv 또는 _tgetenv으로 전화해야합니다. 하지만 전달하기 전에 쓰기 가능한 버퍼에 복사해야합니다.

마지막으로 아담이 주석을 달았을 때마다 캐스트를 쓸 때마다 실수를하는 가능성이 큽니다.

+0

아, 전화 해,'* getenv' 함수가 읽기 전용이지만, 'const' 포인터는 아닌 것을 잊어 버렸습니다. 'CreateProcessAsUser'와'CreateProcess'가 쓰기 가능한 명령 줄을 필요로하는 이유는 [CreateProcess 함수가 입력 명령 줄을 수정하는 이유는 무엇입니까?] (http://blogs.msdn.com/b/oldnewthing/archive/2009/06/)를보십시오. 01/9673254.aspx). –

0

getenv()는 응용 프로그램에서 사용하도록 설정된 문자 집합과 상관없이 항상 char *를 반환합니다. 필요에 따라 char *와 wchar_t * 사이에서 조정되므로 _tgetenv()를 대신 사용해보십시오.