programing

파라미터로 외부 프로그램을 호출하는 방법은?

bestprogram 2023. 10. 9. 23:27

파라미터로 외부 프로그램을 호출하는 방법은?

코드 자체 내에서 매개변수가 결정된 내 코드 내 윈도우 프로그램을 호출하고 싶습니다.

외부 기능이나 메서드를 호출하는 것이 아니라 WinXP 환경 내의 실제 .exe 또는 batch/script 파일을 호출하려고 합니다.

C 또는 C++가 선호되는 언어이지만 다른 언어(ASM, C#, Python 등)에서 더 쉽게 할 수 있다면 알려주세요.

CreateProcess(), System() 등을 호출할 때 파일 이름 및/또는 정규화된 경로에 공백이 있는 경우 파일 이름 문자열(명령 프로그램 파일 이름 포함)을 이중으로 따옴표로 지정해야 합니다. 그렇지 않으면 파일 이름 경로의 일부가 명령 인터프리터에 의해 별도의 인수로 구문 분석됩니다.

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

Windows의 경우 CreateProcess()를 사용하는 것이 좋습니다.더 엉망인 설정을 가지고 있지만 프로세스가 시작되는 방법을 더 잘 제어할 수 있습니다(그렉 휴길의 설명에 따르면).빠르고 더러운 경우 WinExec()을 사용할 수도 있습니다.(시스템()은 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를 찾을 수 있으므로 의 파일 이름을 완전하게 지정할 필요는 없습니다. 단, C를 사용하지 마십시오.\Windows\system32\cmd.exe).

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
        }
    }

윈도우 API에서 CreateProcess 기능을 찾으시는 것 같습니다.실제로 관련 전화가 있지만 이를 통해 시작할 수 있습니다.그것은 아주 쉽습니다.

이를 위한 가장 간단한 방법 중 하나는system()런타임 라이브러리 함수입니다.매개 변수로 단일 문자열을 사용합니다(보다 매개 변수 수가 적음).CreateProcess!) 를 입력한 것처럼 실행합니다.system()또한 프로세스가 반환되기 전에 프로세스가 완료될 때까지 자동으로 기다립니다.

다음과 같은 제한도 있습니다.

  • 런칭 프로세스에서 stdin과 stdout에 대한 통제력이 떨어집니다.
  • 다른 프로세스가 실행되는 동안에는 다른 작업을 수행할 수 없습니다(예: 삭제 결정).
  • 다른 프로세스를 쿼리하기 위해 다른 프로세스에 대한 핸들을 얻을 수 없습니다.

는 합니다 합니다.exec*들()execl,execlp,execle,execv,execvp 더 하는

가 Win32에 됩니다.CreateProcess기능을 합니다. 기능을 통해 유연성을 극대화할 수 있습니다.

간단한 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 (); } }

언급URL : https://stackoverflow.com/questions/486087/how-to-call-an-external-program-with-parameters