cl.exe通过CreateProcess启动时似乎没有写入权限。

3
我正在使用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天的时间查找和尝试不同的方法。有任何想法吗?

生成的进程应该具有与调用进程相同的权限;调用进程能否在临时路径中创建文件? - Peter Ritchie
可能与此处相同:https://dev59.com/FV7Va4cB1Zd3GeqPKYKW - alk
@PeterRitchie,是的,调用进程可以在所有可能的临时文件夹中创建和写入文件。我使用了GetEnvironmentVariable来获取TMP和TEMP的位置。两者都指向c:\ users \ xxxxx \ AppData \ Local \ Temp文件夹。第三个文件夹是我传递给CreateProcess的TEMP变量(TEMP = c:\ temp \ test \ tmp)。 - Shammi
@alk,不好意思,我的临时文件夹里没有提到的那些文件。 - Shammi
1个回答

6

找到了问题所在。

我使用进程监视器来监视cl.exe的运行情况,以查看失败原因。可以从http://technet.microsoft.com/en-us/sysinternals/bb896645下载进程监视器。

结果发现它无法在windows系统文件夹中加载rsaenh.dll。cl.exe无法解析%SystemRoot%环境变量。由于我覆盖了环境变量,它被重置了。将SystemRoot=c:\Windows添加到环境变量中可以修复该问题。正确的修复方法应该是获取当前进程的环境变量,解析并修改它以进行路径添加,然后传递给cl.exe。这样一来,您就继承了所有的环境变量。


将“SystemRoot=c:\Windows”添加到系统环境中对我有用,谢谢。但是需要重新启动Windows。 - Mehmet Fide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接