我打電話給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天谷歌搜索和嘗試不同的事情。有任何想法嗎?
產生的進程應該具有與調用進程相同的權限;調用進程是否能夠在臨時路徑中創建文件? –
可能與此處一樣:http://stackoverflow.com/questions/8584811/c-msvs-what-file-cleanup-should-i-be-doing-cl-error-d8037 – alk
@PeterRitchie,是的調用過程可以在所有可能的臨時文件夾中創建和寫入文件。我使用GetEnvironmentVariable獲取TMP以及TEMP的位置。都指向c:\ users \ xxxxx \ AppData \ Local \ Temp文件夾。第三個文件夾是TEMP var我傳入CreateProcess(TEMP = c:\ temp \ test \ tmp)。 – Shammi