-->

CL.EXE时通过CreateProcess的推出似乎不具有写权限(cl.exe when laun

2019-09-17 04:46发布

我打电话的CreateProcess启动cl.exe时(Win7上64位VS2010)。 我碰到下面的错误..

CL:命令行错误D8037:无法创建临时文件金正日; 老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天google搜索和尝试不同的东西。 有任何想法吗?

Answer 1:

发现这个问题。

我用进程监视器来监视cl.exe时看到什么是失败。 过程监控可以从下载http://technet.microsoft.com/en-us/sysinternals/bb896645 。

事实证明,它是失败在Windows系统文件夹加载rsaenh.dll。 cl.exe时解决不了的%SystemRoot%环境变量。 由于我是压倒一切的环境变量,它被重置。 添加SYSTEMROOT = C:\ WINDOWS环境变量固定它 。 正确的解决将是获取环境变量的当前进程,解析并修改它,使你的路径增加,然后通过在你继承所有环境变量的方式。



文章来源: cl.exe when launched via CreateProcess does not seem to have write permissions