PDA

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



Snake_B
09.10.2010, 22:24
Для руководства к программе нужно написать пример запуска программы с командной строкой в разных языках программирования...

пример на делфи:

uses ShellApi;
...
ShellExecute(0, nil, pChar(ExtractFiledir(paramStr(0))+'\SB.ProgramsTool.exe'), pchar(CmStr), nil, 5);

и ещё один вопрос... в командной строке параметры будут выделены кавычками "", как в C++ задать эти кавычки?

sweeper
09.10.2010, 23:43
Что-то не очень въехал в предмет, но раз просят...

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

system(commandline);

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

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

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

Snake_B
09.10.2010, 23:56
<div class='quotetop'>Цитата(sweeper * 9.10.2010, 22:43) 357451</div>

Что-то не очень въехал в предмет, но раз просят...

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

system(commandline);

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

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

а если требуется как в примере полный путь на себя указать, то это из произвольной функции не сделать, нужно из main() или ее аналога.
[/b]

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

system(commandline); - это запуск ехе?

sweeper
10.10.2010, 00:12
<div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) 357452</div>


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

<div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) 357452</div>

system(commandline); - это запуск ехе?
[/b]Это вызов системного вызова с параметром, в качестве параметра - указатель на строку, которая будет проинтерпретирована системой как содержащая команду.

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

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

[code]
std::string g_program_path;

main(int argc, char **argv)
{

Snake_B
10.10.2010, 00:29
<div class='quotetop'>Цитата(sweeper * 9.10.2010, 23:12) 357454</div>

<div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) 357452


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

<div class='quotetop'>Цитата(Snake_B * 10.10.2010, 1:56) 357452</div>

system(commandline); - это запуск ехе?
[/b]Это вызов системного вызова с параметром, в качестве параметра - указатель на строку, которая будет проинтерпретирована системой как содержащая команду.

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

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

[code]
std::string g_program_path;

main(int argc, char **argv)
{

sweeper
10.10.2010, 07:23
Давай разберем.

Справочно: http://www.cyberforum.ru/delphi-beginners/thread21742.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);

Впрочем, вопрос формирования списка параметров всё равно остается.

Snake_B
10.10.2010, 09:16
<div class='quotetop'>Цитата(sweeper * 10.10.2010, 6:23) 357468</div>

Давай разберем.

Справочно: http://www.cyberforum.ru/delphi-beginners/thread21742.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) 357468</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\"";
единственный изменяемый там параметр это путь к ехе-шнику запускающей программы...