Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用参数调用外部程序?_C++_C_Winapi_External Application - Fatal编程技术网

C++ 如何使用参数调用外部程序?

C++ 如何使用参数调用外部程序?,c++,c,winapi,external-application,C++,C,Winapi,External Application,我想在我的代码中调用一个windows程序,参数由代码本身决定 我不想调用外部函数或方法,而是在WinXP环境中调用实际的.exe或批处理/脚本文件 < P> C或C++是首选语言,但如果用其他语言更容易地完成,请让我知道(ASM、C、Python等)。 < P>我想你正在寻找Windows API中的函数。实际上有一系列相关的电话,但这会让你开始。这很简单。最简单的方法之一是使用system()运行时库函数。它将单个字符串作为参数(比CreateProcess!)少得多的参数),并像在命令行上

我想在我的代码中调用一个windows程序,参数由代码本身决定

我不想调用外部函数或方法,而是在WinXP环境中调用实际的.exe或批处理/脚本文件


< P> C或C++是首选语言,但如果用其他语言更容易地完成,请让我知道(ASM、C、Python等)。

< P>我想你正在寻找Windows API中的函数。实际上有一系列相关的电话,但这会让你开始。这很简单。

最简单的方法之一是使用
system()
运行时库函数。它将单个字符串作为参数(比
CreateProcess
!)少得多的参数),并像在命令行上键入一样执行它<代码>系统()

还有一些限制:

  • 您对已启动进程的stdin和stdout的控制较少
  • 当另一个进程正在运行时,您不能执行任何其他操作(例如决定终止它)
  • 您无法获取另一个进程的句柄以便以任何方式查询它
运行时库还提供了一系列
exec*
函数(
execl
execlp
execle
execv
execvp
,或多或少),这些函数都是从Unix传统中派生出来的,可以提供对进程的更多控制

在最低级别,在Win32上,所有进程都由
CreateProcess
函数启动,这为您提供了最大的灵活性。

C++示例:

char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);
C#示例:


调用CreateProcess()、System()等时,请确保双引号引用文件名字符串(包括命令程序文件名),以防文件名和/或完全限定路径有空格,否则命令解释器将解析文件名路径的部分作为单独的参数

system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");
对于Windows,建议使用CreateProcess()。它有messier设置,但您可以更好地控制流程的启动方式(如Greg Hewgill所述)。对于快速和肮脏,您也可以使用WinExec()。 (system()可移植到UNIX)

启动批处理文件时,可能需要使用cmd.exe(或command.com)启动

(或
SW\u SHOW\u NORMAL
如果希望显示命令窗口)

Windows应该在系统路径中找到CurdUng/CM.exe,这样就不需要完全合格,但是如果您想确定可以使用完全的合格文件名(不要简单使用C:\Windows \Stult32 \CMD.exe)。< /P> < P>简单C++示例(在搜索了几个网站后发现)

#包括
#包括
#包括
#包括
int main(常量int argc,常量字符**argv){
试一试{
断言(argc==2);
常量std::string文件名=(常量std::string)argv[1];
const std::string begin=“g++-7”+文件名;
const std::string end=“-Wall-Werror-Wfatal errors-O3-std=c++14-o a.elf-L/usr/lib/x86_64-linux-gnu”;
const std::string命令=开始+结束;

std::这肯定是我想找的…但是这些限制很难克服…如果设计能与之配合,我可能会这样做。感谢这些信息!这些是关于未来可能遇到的障碍和一般性澄清的绝妙提示。非常感谢。嗯,这不像使用system()那么简单但至少这样的解决方案是存在的!谢谢你最强烈的建议和链接。
system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");
WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED);
#include <bits/stdc++.h>
#include <cassert>
#include <exception>
#include <iostream>

int main (const int argc, const char **argv) {
try {
    assert (argc == 2);
    const std::string filename = (const std::string) argv [1];
    const std::string begin = "g++-7 " + filename;
    const std::string end = " -Wall -Werror -Wfatal-errors -O3 -std=c++14 -o a.elf -L/usr/lib/x86_64-linux-gnu";
    const std::string command = begin + end;
    std::cout << "Compiling file using " << command << '\n';

    assert (std::system ((const char *) command.c_str ()) == 0);
    std::cout << "Running file a.elf" << '\n';
    assert (std::system ((const char *) "./a.elf") == 0);

    return 0; }
catch (std::exception const& e) { std::cerr << e.what () << '\n'; std::terminate (); }
catch (...) { std::cerr << "Found an unknown exception." << '\n'; std::terminate (); } }