2012-05-12 3 views
3

CreateProcess를 호출하여 cl.exe (Win7 64 비트에서 VS2010)를 시작합니다. 다음과 같은 오류가 발생합니다.CreateProcess를 통해 시작된 cl.exe에 쓰기 권한이없는 것 같습니다.

cl : 명령 줄 오류 D8037 : 임시 IL 파일을 만들 수 없습니다. 이전 il 파일의 임시 디렉토리 정리

cmd 창에서 동일한 환경 변수를 사용하여 동일한 명령 행을 호출하면 성공합니다. 임시 디렉토리를 확인했는데 오래된 파일이 없습니다. 생성 된 프로세스에 쓰기 권한이없는 것 같습니다. 저는 다른 접근법을 시도해 왔습니다 .. CreateProcessAsUser, 상속 된 핸들을 사용하는 경우와 사용하지 않는 경우 모두 Everyone 사용자 그룹에 모든 표준 사용 권한을 부여하도록 보안 특성을 설정합니다.

그리고 여기에 기본 코드의 ... 당신이 이상한 경로에 대해 궁금해하는 경우

SECURITY_ATTRIBUTES sa; 
sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
sa.bInheritHandle = TRUE; 
sa.lpSecurityDescriptor = NULL; 

const char* _szSourceFile = "c:\\temp\\test\\src\\foo.cpp"; 

char szOptions[ 2048 ]; 
sprintf_s(szOptions, 
    "c:\\temp\\compile\\cl.exe " 
    "/Gd " 
    "/Fo\"c:\\temp\\test\\out\\\" " 
    "/Fe\"c:\\temp\\test\\out\\\" " 
    "/Fd\"c:\\temp\\test\\out\\\" " 
    "/D \"WIN32\" " 
    "/D \"_DEBUG\" " 
    "/D \"_WINDOWS\" " 
    "/D \"_USRDLL\" " 
    "/D \"_WINDLL\" " 
    "/D \"_MBCS\" " 
    "/I\"c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include\" " 
    "/MDd " 
    "/I\"c:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\include\" " 
    "/LDd " 
    "%s " 
    "c:\\temp\\test\\lib\\Uuid.Lib " 
    "c:\\temp\\test\\lib\\oldnames.lib " 
    "c:\\temp\\test\\lib\\msvcrtd.lib" 
    , _szSourceFile); 


STARTUPINFO si; 
PROCESS_INFORMATION pi; 
ZeroMemory(&si, sizeof(STARTUPINFO)); 
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); 
si.cb = sizeof(STARTUPINFO); 

BOOL bSucceeded = CreateProcess("c:\\temp\\compile\\cl.exe", szOptions, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, "PATH=c:\\temp\\Compile;%PATH%\0TEMP=c:\\temp\\test\\tmp\0\0", "c:\\temp\\test\\", &si, &pi); 

, 나는 libs와 등이 직접 DLL을 구축하기 위해 필요한 도구의 가장 최소한의 복사 cpp 파일 코드의 명령은 환경 변수 블록에 설정된 경로와 함께 일반 명령 행에서 작동합니다.

또한이 기능이 무엇인지 궁금한 점이 있다면 동적으로 DLL을 다시로드 할 수있는 앱을 갖기 위해 노력하고 있습니다. 응용 프로그램은 디버깅/시각화에 사용되고 있으며 아이디어는 즉시 시각화 코드를 조정할 수 있고 응용 프로그램이 DLL을 다시로드하게 할 수 있습니다.

저는 4 일 동안 인터넷 검색 및 다른 것들을 시도했습니다. 어떤 아이디어?

+0

생성 된 프로세스는 호출 프로세스와 동일한 권한을 가져야합니다. 호출 프로세스가 임시 경로에 파일을 만들 수 있습니까? –

+0

아마도 여기와 같습니다 : http://stackoverflow.com/questions/8584811/c-msvs-what-file-cleanup-should-i-be-doing-cl-error-d8037 – alk

+0

@PeterRitchie, 예 호출 프로세스 가능한 모든 임시 폴더에 파일을 작성하고 쓸 수 있습니다. GetEnvironmentVariable을 사용하여 TMP와 TEMP의 위치를 ​​가져 왔습니다. 둘 다 c : \ users \ xxxxx \ AppData \ Local \ Temp 폴더를 가리 킵니다. 세 번째 폴더는 CreateProcess (TEMP = c : \ temp \ test \ tmp)에 전달되는 TEMP var입니다. – Shammi

답변

5

발견.

프로세스 모니터를 사용하여 cl.exe를 모니터링하여 무엇이 실패했는지 확인했습니다. 프로세스 모니터는 http://technet.microsoft.com/en-us/sysinternals/bb896645에서 다운로드 할 수 있습니다.

Windows 시스템 폴더에 rsaenh.dll을로드하지 못했습니다. cl.exe는 % SystemRoot % 환경 변수를 해석 할 수 없습니다. 환경 변수를 무시하고 있었기 때문에 재설정되었습니다. SystemRoot = c : \ Windows를 환경 변수에 추가하면으로 고정되었습니다. 적절한 수정은 현재 프로세스에 대한 환경 변수를 가져 와서 구문을 분석하고 경로를 추가하여 수정 한 다음 전달하는 것입니다. 그러면 모든 환경 변수를 상속받을 수 있습니다.