2012-05-12 30 views
3

我打電話給CreateProcess啓動cl.exe(Win7 64位上的VS2010)。我得到以下錯誤:cl.exe通過CreateProcess啓動時似乎沒有寫入權限

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

在你想知道的怪異路徑的情況下,我複製了最起碼的一套必要的工具,庫等直接從建立一個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文件夾。第三個文件夾是TEMP var我傳入CreateProcess(TEMP = c:\ temp \ test \ tmp)。 – Shammi

回答

5

發現問題。

我使用進程監視器監視cl.exe以查看失敗的內容。 過程監控器可以從http://technet.microsoft.com/en-us/sysinternals/bb896645下載。

原來,它是無法加載rsaenh.dll在Windows系統文件夾。 cl.exe無法解析%SystemRoot%環境變量。由於我重寫了環境變量,因此重置。 將SystemRoot = c:\ Windows添加到修復環境變量。正確的解決方法是獲取當前進程的環境變量,解析並修改它以使路徑增加,然後將其傳入。這樣您就可以繼承所有環境變量。