32

我想在我的代码中调用一个 Windows 程序,并在代码本身中确定参数。

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

C 或 C++ 将是首选语言,但如果使用任何其他语言更容易做到这一点,请告诉我(ASM、C#、Python 等)。

4

5 回答 5

30

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

system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");

对于 Windows,建议使用 CreateProcess()。它的设置更混乱,但您可以更好地控制进程的启动方式(如 Greg Hewgill 所述)。为了快速和肮脏,您还可以使用 WinExec()。(system() 可移植到 UNIX)。

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

WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED);

(或者SW_SHOW_NORMAL如果您希望显示命令窗口)。

Windows 应该在系统 PATH 中找到 command.com 或 cmd.exe,因此 in 不需要完全限定,但如果您想确定可以使用CSIDL_SYSTEM(不要简单地使用 C:\Windows \system32\cmd.exe)。

于 2009-01-28T03:42:15.413 回答
12

C++ 示例:

char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);

C# 示例:

    private static void RunCommandExample()
    {
        // Don't forget using System.Diagnostics
        Process myProcess = new Process();

        try
        {
            myProcess.StartInfo.FileName = "executabletorun.exe";

            //Do not receive an event when the process exits.
            myProcess.EnableRaisingEvents = false;

            // Parameters
            myProcess.StartInfo.Arguments = "/user testuser /otherparam ok";

            // Modify the following to hide / show the window
            myProcess.StartInfo.CreateNoWindow = false;
            myProcess.StartInfo.UseShellExecute = true;
            myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

            myProcess.Start();

        }
        catch (Exception e)
        {
            // Handle error here
        }
    }
于 2009-01-28T01:24:30.340 回答
8

我认为您正在寻找 Windows API 中的CreateProcess函数。实际上有一系列相关的电话,但这会让你开始。这很容易。

于 2009-01-28T01:12:22.080 回答
6

最简单的方法之一是使用system()运行时库函数。它将单个字符串作为参数(比CreateProcess! 少得多的参数)并像在命令行上键入一样执行它。system()还会在返回之前自动等待进程完成。

还有一些限制:

  • 您对已启动进程的标准输入和标准输出的控制较少
  • 当另一个进程正在运行时,你不能做任何其他事情(比如决定杀死它)
  • 您无法获取其他进程的句柄以便以任何方式查询它

运行时库还提供了一系列exec*函数(execlexeclpexecleexecvexecvp或多或少),这些函数源自 Unix 传统,并提供对进程的更多控制。

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

于 2009-01-28T01:19:27.200 回答
0

简单的 c++ 示例(搜索了几个网站后找到)

#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 (); } }
于 2019-02-25T16:42:19.617 回答