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

时间:2012-05-12 03:16:08

标签: c permissions createprocess cl.exe

我正在调用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 );

如果你想知道奇怪的路径,我复制了最小的必需工具,libs等,直接从cpp文件构建一个dll。代码中的命令在常规命令行上运行,其中包含在环境变量块中设置的路径。

此外,如果你想知道这是为了什么,我正在尝试一个可以动态重新加载DLL的应用程序。该应用程序用于调试/可视化,其目的是能够动态调整可视化代码并让应用程序重新加载dll。

我已经在谷歌上搜索了4天并尝试了不同的东西。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

发现了这个问题。

我使用进程监视器监视cl.exe以查看失败的内容。 可以从http://technet.microsoft.com/en-us/sysinternals/bb896645下载进程监视器。

原来,它无法在Windows系统文件夹中加载rsaenh.dll。 cl.exe无法解析%SystemRoot%环境变量。由于我覆盖了环境变量,因此重置了。 将SystemRoot = c:\ Windows添加到修复它的环境变量。正确的解决方法是获取当前进程的环境变量,解析并修改它以使路径添加,然后传入。这样就可以继承所有环境变量。