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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.04.2014, 17:36
EviLrul EviLrul вне форума
Прохожий
 
Регистрация: 17.04.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Что не так с WinExec...

Код:
WinExec ('net use b: \\192.168.1.10\Inst', SW_SHOW);

команда net use отрабатывает, всё хорошо, а вот...

Код:
WinExec ('start /wait \\192.168.1.10\inst\instal\NetDisk.bat', SW_SHOW);

команда start отрабатывать не хочет, ни ошибки, ни запуска БАТ-файла не происходит...

если же в командной строке выполнить start /wait \\192.168.1.10\inst\instal\NetDisk.bat, то БАТ-файл стартует.

подскажите плз, в чём кривость моих рук?

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

Код:
procedure CreateProcess(CommandLine: String);
var
  startupinfoa: TStartupInfo;
  processinformation: TProcessInformation;
begin
  ZeroMemory(@startupinfoa, SizeOf(TStartupInfo));
  startupinfoa.cb:=SizeOf(TStartupInfo);
  startupinfoa.dwFlags:=STARTF_USESHOWWINDOW;
  startupinfoa.wShowWindow:=SW_HIDE;
  Windows.CreateProcess(nil, PChar(CommandLine), nil, nil, False, 0, nil, nil,
    startupinfoa, processinformation);
  WaitForSingleObject(processinformation.hProcess, INFINITE);
  CloseHandle(processinformation.hThread);
  CloseHandle(processinformation.hProcess);
end;

Код:
CreateProcess('z.bat');
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 18.04.2014, 10:27
EviLrul EviLrul вне форума
Прохожий
 
Регистрация: 17.04.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Уважаемый NumLock, большое спс за отзывчивость!
Хотелось бы Вас попросить прокоментить ваш код, хотелось бы лучше его понять... т.к. использовал ранее практически как я посмотрю аналогичный код...
Код:
procedure Start(name: string);
var
   si: STARTUPINFO;
   pi: PROCESS_INFORMATION;
begin
   ZeroMemory(@si,sizeof(si));
   si.cb:=SizeOf(si);
   if not CreateProcess(nil, PChar(name), nil, nil, False, 0, nil, nil, si, pi) then begin
      ShowMessage( 'CreateProcess failed.' );
      Exit;
   end;
   WaitForSingleObject( pi.hProcess, INFINITE );
   CloseHandle( pi.hProcess );
   CloseHandle( pi.hThread );
   //ShowMessage('Done !');
end;
Код:
if form1.CheckBox4.Checked=true then Start(Rn[1,2]+Rn[4,1]+'7Zip\Inst7z.bat');
и на разных ПК и разных ОС (winXP, win7), то стартует, то выдаёт по не понятной мне закономерности "CreateProcess failed" (я так понимаю что CreateProcess не отрабатывал в какие то моменты) может у меня всё же код кривой? поможите чем сможите...

А так же интересно, почему не отрабатывает все же мой вариант, есть предположения?

Последний раз редактировалось EviLrul, 18.04.2014 в 10:45.
Ответить с цитированием
  #4  
Старый 18.04.2014, 11:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от EviLrul
Хотелось бы Вас попросить прокоментить ваш код, хотелось бы лучше его понять...
Что именно в этом коде непонятно? Здесь центральное место это вызов API-функции CreateProcess, всё что до этого - подготовительные операции, то что после - завершающие операции. API-функция WaitForSingleObject ожидает сигнала, в данном случае бесконечно (INFINITE), в случае с хэндлом процесса сигналом является завершение приложения, т.е. эта функция в данном случае фактически "повесит" запускающее приложение пока не завершится запускаемое приложение.
По поводу функции WinExec - она очень древняя и ей лучше не пользоваться. Лучшая ей замена это CreateProcess или же менее предпочтительная ShellExecute.
Цитата:
Сообщение от EviLrul
и на разных ПК и разных ОС (winXP, win7), то стартует, то выдаёт по не понятной мне закономерности "CreateProcess failed" (я так понимаю что CreateProcess не отрабатывал в какие то моменты) может у меня всё же код кривой? поможите чем сможите...
Самого факта что процесс не был запущен не достаточно. В случае ошибки CreateProcess устанавливает так же и код ошибки который можно узнать API-функцией GetLastError и декодировать её в осмысленный текст API-функцией SysErrorMessage. Или же вместо этого можно просто вызвать исключение функцией RaiseLastOSError.
Цитата:
Сообщение от EviLrul
А так же интересно, почему не отрабатывает все же мой вариант, есть предположения?
Во-первых не указано расширение запускаемого файла - имя у этого файла скорее всего не просто "start", а "start.exe" - вот так и нужно указывать в WinExec.
Во-вторых возможно это файл не находится ни в одной из тех папок в которых WinExec может его найти, поэтому желательно указывать перед именем файла и полный путь к нему, или как минимум устанавливать соответствующую текущую директорию с помощью SetCurrentDir.
Ответить с цитированием
  #5  
Старый 19.04.2014, 10:15
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от EviLrul
А так же интересно, почему не отрабатывает все же мой вариант, есть предположения?
The WinExec function runs the specified application.
так нет такого приложения start!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 19.04.2014, 13:17
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
имя у этого файла скорее всего не просто "start", а "start.exe" - вот так и нужно указывать в WinExec.
ЕМНИП, start -- это внутренняя команда cmd, а не отдельное приложение.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter