+ Ответить в теме
Показано с 1 по 7 из 7

Тема: ShellExecute, запуск программы с командной строкой в разных языках...

  1. #1
    идейный враг всяких трансформероB

    Аватар для Snake_B


    Регистрация
    14.09.2007
    Адрес
    Донецк-Камчатка....
    Сообщений
    13,314
    Для руководства к программе нужно написать пример запуска программы с командной строкой в разных языках программирования...

    пример на делфи:
    Код:
    uses ShellApi; 
    ... 
    ShellExecute(0, nil, pChar(ExtractFiledir(paramStr(0))+'\SB.ProgramsTool.exe'), pchar(CmStr), nil, 5);
    и ещё один вопрос... в командной строке параметры будут выделены кавычками "", как в C++ задать эти кавычки?
    продвинь это сообщение в соцсеть:  

  2. #2
    Злой магрибский колдун CIVFANATICS.RU TEAM Аватар для sweeper


    Регистрация
    01.03.2005
    Сообщений
    2,968
    Что-то не очень въехал в предмет, но раз просят...

    char commandline[]={"programname.exe"};

    system(commandline);

    а кавычки задать так:

    char commandline_with_quotes[]={"programname.exe \"param1\" \"param2\""};

    а если требуется как в примере полный путь на себя указать, то это из произвольной функции не сделать, нужно из main() или ее аналога.
    продвинь это сообщение в соцсеть:  
    Вот уже несколько лет все мои посты крутятся вокруг темы реалистичной модели цивилизации.

  3. #3
    идейный враг всяких трансформероB

    Аватар для Snake_B


    Регистрация
    14.09.2007
    Адрес
    Донецк-Камчатка....
    Сообщений
    13,314
    <div class='quotetop'>Цитата(sweeper * 9.10.2010, 22:43) [snapback]357451[/snapback]</div>
    Что-то не очень въехал в предмет, но раз просят...

    char commandline[]={"programname.exe"};

    system(commandline);

    а кавычки задать так:

    char commandline_with_quotes[]={"programname.exe \"param1\" \"param2\""};

    а если требуется как в примере полный путь на себя указать, то это из произвольной функции не сделать, нужно из main() или ее аналога.
    [/b]
    в папке программы лежит утилита (или в одной из подпапок), её надо запусить из программы...
    в теории так - "programname.exe", будет работать... но на делфи, если так написать и запустить программу с ярлыка в котором не указана рабочая папка... будет ошибка...
    С++ в этом случае как себя поведет?

    system(commandline); - это запуск ехе?
    продвинь это сообщение в соцсеть:  

  4. #4
    Злой магрибский колдун CIVFANATICS.RU TEAM Аватар для sweeper


    Регистрация
    01.03.2005
    Сообщений
    2,968
    <div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) [snapback]357452[/snapback]</div>

    в папке программы лежит утилита (или в одной из подпапок), её надо запусить из программы...
    в теории так - "programname.exe", будет работать... но на делфи, если так написать и запустить программу с ярлыка в котором не указана рабочая папка... будет ошибка...
    С++ в этом случае как себя поведет?
    [/b]
    В данном случае не речь о C/C++, но о системном вызове. Поведет аналогично дельфям.

    <div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) [snapback]357452[/snapback]</div>
    system(commandline); - это запуск ехе?
    [/b]
    Это вызов системного вызова с параметром, в качестве параметра - указатель на строку, которая будет проинтерпретирована системой как содержащая команду.

    Если нужно вызвать из рабочей папки, при условии, что текущая директория из самой программы не меняется, можно использовать "..\\..\\path\\filename.exe" или ".\\path\\filename.exe".

    Если нужен абсолютный путь, его придется где-то найти. Например, так:

    [code]
    std::string g_program_path;

    main(int argc, char **argv)
    {
    продвинь это сообщение в соцсеть:  
    Вот уже несколько лет все мои посты крутятся вокруг темы реалистичной модели цивилизации.

  5. #5
    идейный враг всяких трансформероB

    Аватар для Snake_B


    Регистрация
    14.09.2007
    Адрес
    Донецк-Камчатка....
    Сообщений
    13,314
    <div class='quotetop'>Цитата(sweeper * 9.10.2010, 23:12) [snapback]357454[/snapback]</div>
    <div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) [snapback]357452[/snapback]

    в папке программы лежит утилита (или в одной из подпапок), её надо запусить из программы...
    в теории так - "programname.exe", будет работать... но на делфи, если так написать и запустить программу с ярлыка в котором не указана рабочая папка... будет ошибка...
    С++ в этом случае как себя поведет?
    [/b]
    В данном случае не речь о C/C++, но о системном вызове. Поведет аналогично дельфям.

    <div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) [snapback]357452[/snapback]</div>
    system(commandline); - это запуск ехе?
    [/b]
    Это вызов системного вызова с параметром, в качестве параметра - указатель на строку, которая будет проинтерпретирована системой как содержащая команду.

    Если нужно вызвать из рабочей папки, при условии, что текущая директория из самой программы не меняется, можно использовать "..\\..\\path\\filename.exe" или ".\\path\\filename.exe".

    Если нужен абсолютный путь, его придется где-то найти. Например, так:

    [code]
    std::string g_program_path;

    main(int argc, char **argv)
    {
    продвинь это сообщение в соцсеть:  

  6. #6
    Злой магрибский колдун CIVFANATICS.RU TEAM Аватар для sweeper


    Регистрация
    01.03.2005
    Сообщений
    2,968
    Давай разберем.

    Справочно: http://www.cyberforum.ru/delphi-begi...read21742.html

    Твой вызов
    Код:
    uses ShellApi;
    ...
    ShellExecute(0, nil, pChar(ExtractFiledir(paramStr(0))+&#39;\SB.ProgramsTool.exe&#39;), pchar(CmStr), nil, 5);
    означает: в отдельном окне открыть программу с именем SB.ProgramsTool.exe, находящуюся в той же директории, что и текущая программа, передать ей список параметров, находящийся в переменной CmStr, каталог по умолчанию -- текущий, стиль окна = 5.

    system воспринимает только один параметр -- командную строку. Возможно, существуют другие вызовы, аналогичные ShellExecute(), особенно в windows.

    То есть для того, чтобы воспользоваться system(), нужно построить эту командную строку. Прямой перевод с твоего примера на дельфи будет:

    Код:
    std::strinfg cmdline;
    cmdline=".\\SB.ProgramsTool.exe "+CmStr; // [sic] extra space between &#39;.exe&#39; and &#39;"&#39;
    system(cmdline.c_str());
    А кавычки в списке параметров -- это где-то отдельно, так же как и формирование CmStr в твоем коде

    Пример был на C++, на чистом C немного по-другому:
    Код:
    char cmdline[1024]={".\\SB.ProgramsTool.exe "};
    strcat(cmdline,CmStr);
    system(cmdline);
    Впрочем, вопрос формирования списка параметров всё равно остается.
    продвинь это сообщение в соцсеть:  
    Вот уже несколько лет все мои посты крутятся вокруг темы реалистичной модели цивилизации.

  7. #7
    идейный враг всяких трансформероB

    Аватар для Snake_B


    Регистрация
    14.09.2007
    Адрес
    Донецк-Камчатка....
    Сообщений
    13,314


    <div class='quotetop'>Цитата(sweeper * 10.10.2010, 6:23) [snapback]357468[/snapback]</div>
    Давай разберем.

    Справочно: http://www.cyberforum.ru/delphi-begi...read21742.html

    Твой вызов
    Код:
    uses ShellApi;
    ...
    ShellExecute(0, nil, pChar(ExtractFiledir(paramStr(0))+&#39;\SB.ProgramsTool.exe&#39;), pchar(CmStr), nil, 5);
    означает: в отдельном окне открыть программу с именем SB.ProgramsTool.exe, находящуюся в той же директории, что и текущая программа, передать ей список параметров, находящийся в переменной CmStr, каталог по умолчанию -- текущий, стиль окна = 5.

    system воспринимает только один параметр -- командную строку. Возможно, существуют другие вызовы, аналогичные ShellExecute(), особенно в windows.

    То есть для того, чтобы воспользоваться system(), нужно построить эту командную строку. Прямой перевод с твоего примера на дельфи будет:

    Код:
    std::strinfg cmdline;
    cmdline=".\\SB.ProgramsTool.exe "+CmStr; // [sic] extra space between &#39;.exe&#39; and &#39;"&#39;
    system(cmdline.c_str());
    А кавычки в списке параметров -- это где-то отдельно, так же как и формирование CmStr в твоем коде

    Пример был на C++, на чистом C немного по-другому:
    Код:
    char cmdline[1024]={".\\SB.ProgramsTool.exe "};
    strcat(cmdline,CmStr);
    system(cmdline);
    [/b]
    в общем то всё понятно...

    я так понимаю только вопрос об рабочем каталоге и абсолютных путях опять всплывает...
    но я тут чё то не вьезжаю... раздел main... там что то вроде... основного цикла/кода программы? т.е. обработка не как на делфи (при возникновении события).... а что то вроде консольного приложения делфи...?
    ну это так.... для общего развития ))

    <div class='quotetop'>Цитата(sweeper * 10.10.2010, 6:23) [snapback]357468[/snapback]</div>
    Впрочем, вопрос формирования списка параметров всё равно остается.
    [/b]
    формирование списка параметров в общем то я думаю не проблема, их можно просто строкой заполнить:
    &#39;0 &#39;+ProName+&#39; &#39;+ProVers+&#39; &#39;+Lang+&#39; &#39;+PatchToExe+&#39; &#39;+URLtoFile+&#39; &#39;+URLtoMSG
    на пример так:
    cmdline=".\\SB.ProgramsTool.exe "+"0 \"CardWars\" \"0.6.0\" \"Russian\"";
    единственный изменяемый там параметр это путь к ехе-шнику запускающей программы...
    продвинь это сообщение в соцсеть:  

+ Ответить в теме

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters