用于批处理脚本的 Visual Studio 2010 CreateProcess()

Posted

技术标签:

【中文标题】用于批处理脚本的 Visual Studio 2010 CreateProcess()【英文标题】:Visual Studio 2010 CreateProcess() for batch script 【发布时间】:2014-03-17 20:42:08 【问题描述】:

我正在尝试在 Visual Studio 2010 中运行批处理脚本。我正在关注找到的代码 here 以及 MSDN document。

创建.exe 时,我在Release 和Debug 文件夹中都创建了running.bat 文件(两种编译方法在运行时都失败)。但是我的程序每次都崩溃并显示错误代码2

main.c - 命令行应用程序

#include "windows.h"
#include "stdio.h"

int main()

        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        if( !CreateProcess(NULL,   
        L"cmd.exe /c running.bat",        
        NULL,         
        NULL,         
        TRUE,        
        CREATE_NEW_CONSOLE,            
        NULL,           
        NULL,           
        &si,            
        &pi )           
        ) 
    
        printf( "CreateProcess failed (%d)\n", GetLastError() );
        return FALSE;
    

    return 0;

【问题讨论】:

【参考方案1】:

STARTUPINFO 是 CreateProcess 函数的 In 参数,但在您的代码中传递的是垃圾。

STARTUPINFO si = 0;
si.cb = sizeof(STARTUPINFO);
etc...

来自MSDN Documentation:

重要调用者负责确保 STARTUPINFO 中的标准句柄字段包含有效的句柄值。即使 dwFlags 成员指定了 STARTF_USESTDHANDLES,这些字段也会原封不动地复制到子进程中。不正确的值会导致子进程行为不端或崩溃。

至于退出代码2,将批处理文件的完整路径添加到命令中。您可以使用args 或GetModuleFileName 检索应用程序的当前目录。

【讨论】:

以上是关于用于批处理脚本的 Visual Studio 2010 CreateProcess()的主要内容,如果未能解决你的问题,请参考以下文章

从PowerShell设置Visual Studio环境变量

我的 C# win 表单应用程序在内部调用批处理脚本,如何在 Visual Studio 中导出时对最终用户隐藏它?

python BIMEHW - Visual Studio +中的单文件批处理编译器,用于g ++和MSVC

Visual Studio Post-Build 事件调用带有空格的参数的批处理文件

用于区分 Visual Studio 2012 和 2010 的 C# 预处理器指令或条件?

使用 Visual Studio 数据库项目的 PostDeployment 脚本插入图像