Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.02.2015, 16:26
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как запустить приложение через Cmd с параметрами?

Приветствую всех!

Пожалуйста, подскажите как запустить приложение с параметрами через командную строку таким образом:

Код:
cmd.exe /c start affinity 1 C:\Program Files\Project\Program.exe -minimize

программа должна запускаться и окна cmd не должно быть видно вообще.

Играл с WinExec и ShellExecute - не выходит...

Как правильно это сделать? Заранее благодарю.
Ответить с цитированием
  #2  
Старый 01.02.2015, 16:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

WinExec + SW_HIDE
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alloc (01.02.2015)
  #3  
Старый 01.02.2015, 17:45
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
WinExec + SW_HIDE

спасибо! Вроде как работает.. проверьте пожалуйста, правильно ли все сделал (что касается командной строки и самого кода)?

Код:
 WinExec(Pchar('cmd.exe /c start /affinity 1 /d "'+ExtractFileDir(Application.ExeName)+'" '+'Revenant.exe "'+Keys+'"'), SW_HIDE)

И еще вопрос: Как сюда прикрутить коды ошибок которые возвращает функция и дать соответствующее сообщение о них в MessageBox?
Ответить с цитированием
  #4  
Старый 01.02.2015, 18:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
if WinExec('...', SW_HIDE)<32 then RaiseLastOSError;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alloc (01.02.2015)
  #5  
Старый 01.02.2015, 18:51
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Для "32" должна же быть какая-то константа?
If the function succeeds, the return value is greater than 31.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Alloc (03.02.2015)
  #6  
Старый 01.02.2015, 18:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Return value

If the function succeeds, the return value is greater than 31.

If the function fails, the return value is one of the following error values.Return code/value Description
0
The system is out of memory or resources.
ERROR_BAD_FORMAT
The .exe file is invalid.
ERROR_FILE_NOT_FOUND
The specified file was not found.
ERROR_PATH_NOT_FOUND
The specified path was not found.

Цитата:
ERROR_BAD_FORMAT = 11;
ERROR_FILE_NOT_FOUND = 2;
ERROR_PATH_NOT_FOUND = 3;

достаточно с 32 сравнить
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alloc (03.02.2015)
  #7  
Старый 03.02.2015, 13:06
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо, разобрался)
Ответить с цитированием
  #8  
Старый 03.02.2015, 16:24
MotoArhangel MotoArhangel вне форума
Новичок
 
Регистрация: 14.10.2012
Сообщения: 58
Версия Delphi: Delphi 10.4
Репутация: 10
По умолчанию

Где то вычитывал, что правильнее использовать ShellExecute.
Код:
function ShellExecute(hWnd: HWnd; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

в uses подключить ShellAPI и используем.

Пример:
Код:
ShellExecute(0,'open','cmd.exe',Pchar('/c start /'+номер_ядра+' '+'/'+приоритет_если нужен'+DirGames),pchar(ExtractFileDir('полный путь до программы')),SW_HIDE);

подробнее можно посмотреть в google или на msn=)

А есть еще такая фигня если запускать надо программу по определенным ядром.
Код:
procedure Tform1.RunProcess(FilePatch: string; {Priority: TProcessPriority;} corenumber:integer);
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
  Done: Boolean;
  cpuset  : set of 0..31;
begin
  FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
  StartInfo.cb := SizeOf(TStartupInfo);

  CmdLine := Format('"%s" %s', [FilePatch,''{параметры запуска}]);
  UniqueString(CmdLine);
  try
    Done := CreateProcess(PChar(FilePatch), PChar(CmdLine), nil, nil, False,
                          CREATE_NEW_PROCESS_GROUP + Integer(Priority),
                          nil, PChar(ExtractFileDir(FilePatch)) , StartInfo, ProcInfo);
    if Done then
    begin
      // 0 = <All Processors>
      // 1 = CPU 0
      // 2 = CPU 1
      // 3 = CPU 2
      // 4 = CPU 3
      // 5 = CPU 5
      // 6 = CPU 6
      // 7 = CPU 6
      // 8 = CPU 7
      cpuset:=[corenumber];
      //include (cpuset,5); // add cpu 6
      SetProcessAffinityMask(ProcInfo.hProcess, dword(cpuset));
      try
        while not Application.Terminated and
             (WaitForSingleObject(ProcInfo.hProcess, 100)=WAIT_TIMEOUT) do
              Application.ProcessMessages;
        finally
          if ProcInfo.hProcess <> 0 then
            CloseHandle(ProcInfo.hProcess);
            CloseHandle(ProcInfo.hThread);
      end;
    end else
      MessageDlg('Программа не запустится ' + FilePatch, mtError, [mbOk], 0)
  finally
  end;
end;

Последний раз редактировалось MotoArhangel, 03.02.2015 в 16:42.
Ответить с цитированием
  #9  
Старый 03.02.2015, 18:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то вместо WinExec рекомендуется использовать CreateProcess.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
MotoArhangel (04.02.2015)
  #10  
Старый 04.02.2015, 05:29
MotoArhangel MotoArhangel вне форума
Новичок
 
Регистрация: 14.10.2012
Сообщения: 58
Версия Delphi: Delphi 10.4
Репутация: 10
По умолчанию

Код ниже и оставил=)
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter