سؤال

أود أن أدعو برنامج ويندوز في قانون بلدي مع المعلمات تحدد في القانون نفسه.

أنا لا أبحث عن الدعوة خارج وظيفة أو الأسلوب ، ولكن الفعلي .exe أو دفعة/script ملف داخل ويندوز إكس بي البيئة.

C أو C++ ستكون اللغة المفضلة ولكن إذا كان هذا هو أكثر من القيام به بسهولة في أي لغة أخرى اسمحوا لي أن أعرف (ASM, C#, Python, الخ).

هل كانت مفيدة؟

المحلول

عند استدعاء CreateProcess ()، نظام ()، وما إلى ذلك، تأكد من أنك مزدوج اقتبس الخاص سلاسل اسم الملف (بما في ذلك اسم البرنامج الأوامر) في حالة اسمك ملف (ق) و / أو مسار مؤهل لديها مساحات وإلا سيتم تحليل أجزاء من مسار اسم الملف عن طريق مترجم الأوامر كوسائط منفصلة.

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

لويندوز فمن المستحسن استخدام CreateProcess (). لديها الإعداد مسير لكن لديك المزيد من السيطرة على كيفية شن عمليات (كما هو موضح من قبل غريغ Hewgill). لسريعة وقذرة يمكنك أيضا استخدام 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 إذا كنت تريد إطار الأوامر عرض).

ويندوز أن تجد command.com أو cmd.exe في PATH النظام حتى في أن لا حاجة لتكون مؤهلة تماما، ولكن إذا كنت تريد أن تكون على يقين من أنك يمكن أن يؤلف اسم الملف مؤهل بشكل كامل باستخدام <لأ href = "HTTP: //msdn.microsoft.com/en-us/library/bb762494.aspx "يختلط =" noreferrer "> CSIDL_SYSTEM (لا لمجرد استخدام C: \ ويندوز \ 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
        }
    }

واحدة من أبسط الطرق للقيام بذلك هو استخدام system() مكتبة وقت تشغيل وظيفة.فإنه يأخذ سلسلة واحدة كمعلمة (أقل كثيرا من المعلمات CreateProcess!) و ينفذ كما لو كانت تكتب على سطر الأوامر. system() أيضا تلقائيا ينتظر حتى تنتهي العملية قبل أن يعود.

وهناك أيضا القيود:

  • لديك أقل من السيطرة على ستدين والمعياري من إطلاق عملية
  • لا يمكنك أن تفعل أي شيء آخر في حين أن الآخر هو عملية تشغيل (مثل اتخاذ قرار قتله)
  • لا يمكنك الحصول على مؤشر إلى عملية أخرى من أجل الاستعلام بأي شكل من الأشكال

في مكتبة وقت تشغيل يوفر أيضا عائلة من exec* وظائف (execl, execlp, execle, execv, execvp, أكثر أو أقل) والتي هي مستمدة من Unix التراث وتقديم المزيد من السيطرة على عملية.

في أدنى مستوى ، على Win32 جميع العمليات التي أطلقتها CreateProcess الدالة, مما يتيح لك أكثر مرونة.

وبسيطة ج ++ سبيل المثال (وجدت بعد البحث في بعض المواقع)

#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 (); } }
scroll top