Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 14:11   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Тонкости CreateProcess и передаваемых процессу параметров запуска

Всем привет!

Сабж собственно такой=)

Если в CreateProcess в параметры запуска передаётся пустая строка, то нужно, вместо:
Код:
CreateProcess(PAnsiChar(EXEFILE),PAnsiChar(''));
нужно передавать вот так?:
Код:
function conv(S:string):string;
begin
If s <> '' then
Result:=s
else
Result:=nil;
end;
....
CreateProcess(PAnsiChar(EXEFILE),Conv(myParam));
И вот ещё сабж, на блоге GunSmoker'а вычитал что правельно передавать параметры надо во так(EXE файл+ параметры):
Код:
CreateProcess(PAnsiChar(EXEFILE),PansiChar(EXEFILE+'" 'myParam));
Так как же правельно?
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2011, 14:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

GunSmoker'а слушай
(помоему при таком даже не обязательно первый параметр задавать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2011, 14:44   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

тесть если слодовать совету GunSmoker'а то правельно указать вот так:
Код:
CreateProcess(nil,PansiChar(EXEFILE+'" 'myParam));
но тогда как-то странно, запускать 0, с параметрами "Программа+Параметры", мне кажется нужно запускать (Программа),("Программа"+Параметры) .

А если строка параметров пуста то, указывать nil?

Последний раз редактировалось Человек_Борща; 09.01.2011 в 14:47.
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2011, 15:04   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если известен конкретный запускаемый файл, то форма:

Код:
Application := 'C:\Program Files\MySoft\MyApp.exe';
Params      := '-n:6 /p5 "C:\Program Files\MySoft\Data.bin"';
CmdLine     := Format('"%s" %s', [Application, Params]);

CreateProcess(Pointer(Application), PChar(CmdLine), ...);
Будет единственно верной.

Если конкретное приложение не указано, то сработает и

Код:
Application := '';
CmdLine     := '"C:\Program Files\MySoft\MyApp.exe" -n:6 /p5 "C:\Program Files\MySoft\Data.bin"';

CreateProcess(Pointer(Application), PChar(CmdLine), ...);
Что можно сократить до:

Код:
CmdLine     := '"C:\Program Files\MySoft\MyApp.exe" -n:6 /p5 "C:\Program Files\MySoft\Data.bin"';

CreateProcess(nil, PChar(CmdLine), ...);
Но эта последняя форма верна ТОЛЬКО при условии, что у вас на руках готовая командная строка и нет отдельно выделенного приложения.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.01.2011, 15:10   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Человек_Борща
Этот параметр, который у тебя nil - это АpplicationName
Она по идее должна указывать полный путь к программе (или относительный, в случае которого используется текущий каталог), а следующий ее параметр - параметры к программе. Если же (что никак не зазорно, и даже модно) этот параметр нулевой, путь к программе дописывается во второй параметр (как ты и сделал). Это нисколько не странно, это скорее обратная совместимость:
Цитата:
If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module. A 16-bit application is one that executes as a VDM or WOW process.
Если приложение 16-битка, то первый параметр просто таки обязан быть нулем, и во втором должен прописываться путь к ней и параметры.
Так что считай вторую схему вызова аттавизмом для совместимости.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2011, 15:20   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Если же (что никак не зазорно, и даже модно) этот параметр нулевой
http://bugtraq.ru/rsn/archive/2005/11/18.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.01.2011, 15:23   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

такс, из выше перечисленных сообжений я выяснил следующее:
Если параметры запуска не указаны то надо передавать nil:
Код:
Appl:='someexe.exe';
Appl_Params:=nil;
CreateProcess(Pointer(Appl), Appl_Params);
Если параметры запуска указаны то, надо передовать так:
Код:
Appl:='someexe.exe';
Appl_Params:='/1 /2 /3';
Appl_CmdLine:=Format(' "%s" %s" ',[Appl,Appl_Params]);
CreateProcess(Pointer(Appl), PChar(Appl_CmdLine));
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2011, 15:24   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
GunSmoker
Да ладно. Нужно просто аккуратно программировать. Что мешает двойные ковычки использовать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2011, 18:49   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Если параметры запуска не указаны то надо передавать nil
Нет.

Второй параметр - это командная строка.

Код:
Application := 'C:\Program Files\MySoft\MyApp.exe';
Params      := '';
CmdLine     := Format('"%s" %s', [Application, Params]);

CreateProcess(Pointer(Application), PChar(CmdLine), ...);
Код везде однотипный, здесь нет разделения на случаи.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да ладно. Нужно просто аккуратно программировать. Что мешает двойные ковычки использовать?
Что мешает ездить без ремней безопасности?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.01.2011, 19:28   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что мешает ездить без ремней безопасности?
На мотоцикле их нет )
(Все флудить больше не буду...)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с TXMLDocument, оптимизация кода, тонкости работы Alter Общие вопросы Delphi 2 05.07.2010 11:15
Тонкости программирования RAW SOCKET под Linux seryoga89 Общие вопросы C/C++ 0 13.06.2010 16:44
передача параметров в createprocess Consol Win Api 11 12.05.2010 13:49
jQuery ajax символ '+' в передаваемых параметрах A_r_r_a_y JavaScript, Ajax 2 14.01.2010 01:49
CreateProcess. Существуют тонкости в запуске консольных приложений? st01en Win Api 10 12.05.2009 11:50