Как назвать внешнюю программу с параметрами?

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    String numero = total.getText().toString();
    int dec = numero.indexOf(".");
    int longitud = numero.length();
    if (dec+3 == longitud && dec != -1) { //3 number decimal + 1
        log.i("ento","si");
        numero = numero.substring(0,dec+3);
        if (contador == 0) {
            contador = 1;
            total.setText(numero);
            total.setSelection(numero.length());
        } else {
            contador = 0;
        }
    }
}
27
задан gkrogers 28 January 2009 в 12:34
поделиться

5 ответов

Когда вы вызываете CreateProcess (), System () и т. Д., Убедитесь, что вы заключили двойные кавычки в строки имени вашего файла (включая имя файла командной программы) на случай, если в именах файлов и / или в полном пути указан пробел в противном случае части пути к имени файла будут интерпретироваться интерпретатором команд как отдельные аргументы.

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

Для Windows рекомендуется использовать CreateProcess (). Он имеет более сложную настройку, но у вас больше контроля над тем, как запускаются процессы (как описано Грегом Хьюгиллом). Для быстрого и грязного вы также можете использовать 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 должна найти command.com или cmd.exe в системной переменной PATH, поэтому не нужно указывать полное имя, но если вы хотите быть уверенным, вы можете составить полное имя файла, используя CSIDL_SYSTEM (не используйте просто C: \ Windows \ system32 \ cmd.exe).

28
ответ дан Roger Nelson 14 October 2019 в 13:48
поделиться

Пример 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
        }
    }
11
ответ дан Rorzilla 14 October 2019 в 13:48
поделиться

Я думаю, что вы ищете функцию CreateProcess в Windows API. Есть на самом деле семья связанных звонков, но это поможет вам начать. Это довольно легко.

8
ответ дан Mark Brittingham 14 October 2019 в 13:48
поделиться

Один из самых простых способов сделать это должно использовать system() функция библиотеки времени выполнения. Это берет единственную строку в качестве параметра (много меньше параметров, чем CreateProcess!) и выполняет его, как будто это было введено на командной строке. system() также автоматически ожидает процесса для окончания, прежде чем он возвратится.

существуют также ограничения:

  • Вы имеете меньше контроля над stdin и stdout запущенного процесса
  • , Вы не можете сделать ничего больше, в то время как другой процесс работает (такие как решение уничтожить его)
  • , Вы не можете получить дескриптор к другому процессу для запросов его всегда

, библиотека времени выполнения также обеспечивает семейство exec* функции (execl, execlp, execle, execv, execvp, более или менее), которые получены из наследия Unix и предлагают больше управления процессом.

На самом низком уровне, на Win32 все процессы запускаются эти CreateProcess функция, которая дает Вам наибольшую гибкость.

5
ответ дан Greg Hewgill 14 October 2019 в 13:48
поделиться

простой пример 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 (); } }
0
ответ дан EnzoGuerra 14 October 2019 в 13:48
поделиться