我正在调用 CreateProcess 来启动 cl.exe(Win7 64 位上的 VS2010)。我收到以下错误..
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 );
如果您想知道奇怪的路径,我复制了最少量的必需工具、库等,以直接从 cpp 文件构建 dll。代码中的命令在常规命令行上使用环境变量块中设置的路径运行。
另外,如果您想知道这是做什么的,我正在尝试开发一个可以动态重新加载 dll 的应用程序。该应用程序用于调试/可视化,其想法是能够动态调整可视化代码并让应用程序重新加载 dll。
我已经在这里使用谷歌搜索并尝试不同的东西 4 天了。有任何想法吗?
最佳答案
发现问题。
我使用进程监视器来监视 cl.exe 以查看发生了什么故障。
进程监视器可以从 http://technet.microsoft.com/en-us/sysinternals/bb896645 下载。
事实证明,它无法在 Windows 系统文件夹中加载 rsaenh.dll。 cl.exe 无法解析 %SystemRoot% 环境变量。由于我覆盖了环境变量,它被重置了。 将 SystemRoot=c:\Windows 添加到环境变量修复了它 。正确的解决方法是获取当前进程的环境变量,解析并修改它以添加路径,然后将其传入。这样您就可以继承所有环境变量。
关于通过 CreateProcess 启动时的 cl.exe 似乎没有写入权限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10560779/