我正在调用CreateProcess来启动cl.exe(Win7 64位上的VS2010)。 我收到以下错误..
cl:命令行错误D8037:无法创建临时il文件; 清除旧的il文件的临时目录
在cmd窗口中使用相同的环境变量调用相同的命令行会成功。 我检查了临时目录,没有旧文件。 似乎创建的进程没有写入权限。 我一直在尝试不同的方法.. CreateProcessAsUser,设置安全属性以授予Everyone用户组的所有标准权限,包括和不包含inheritance句柄等。它们似乎都没有解决它。
这是基本代码……
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% TEMP=c:\temp\test\tmp ", "c:\temp\test\", &si, &pi );
如果你想知道奇怪的路径,我复制了最小的必需工具集,libs等,直接从cpp文件构建一个dll。 代码中的命令在常规命令行上工作,其中包含在环境变量块中设置的路径。
此外,如果你想知道这是为了什么,我正在尝试一个可以动态重新加载DLL的应用程序。 该应用程序用于调试/可视化,其目的是能够动态调整可视化代码并让应用程序重新加载DLL。
我已经在谷歌上搜索了4天并尝试了不同的东西。 有任何想法吗?
发现了这个问题。
我使用进程监视器来监视cl.exe以查看失败的内容。 可以从https://technet.microsoft.com/en-us/sysinternals/bb896645下载进程监视器。
原来它无法在Windows系统文件夹中加载rsaenh.dll。 cl.exe无法解析%SystemRoot%环境变量。 由于我覆盖了环境变量,因此重置了。 将SystemRoot = c: Windows添加到修复它的环境变量中 。 正确的解决方法是获取当前进程的环境变量,解析并修改它以使路径添加,然后将其传入。这样就可以inheritance所有环境变量。
以上就是c/c++开发分享通过CreateProcess启动时,cl.exe似乎没有写入权限相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544877.html