Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов CreateProcess [D6, Win2k]


tyuiop ©   (2004-11-18 08:25:00) 

Возможно, кто-то знает, как решается следующая проблема.
При запуске внешней программы с помощью CreateProcess (прога досовая) с параметром командной строки комп перезагружается. При вызове без параметра все нормально.
В чем может быть дело?


Fay   (2004-11-19 14:08:00) [1]

2 tyuiop
Я не понял. Заработало или нет?


Fay   (2004-11-19 08:41:00) [2]

PChar(cmdLine),  // Command line- это коммандная строка?
Она дожна быть доступна для редактирования. Т.е. выдели память сначала.


tyuiop   (2004-11-19 08:26:00) [3]

Проблему решить так и не удалось, пришлось переписать прогу в Delphi. Просто ради любопытства, может быть, кто-то знает, из-за чего в принципе может происходить такое явление? Мне кажется, там было некорректное обращение к памяти…


Игорь Шевченко   (2004-11-18 12:19:00) [4]

Сломать систему Win2k не так уж просто. Посмотри, может в EventLog что-то пишется при такой вот перезагрузке.


tyuiop   (2004-11-18 11:22:00) [5]


> Если при запуске ДОС-приложения из cmd перезагрузки не происходит,
> то остается только (очень малая) вероятность, что твой код
> запуска содержит небезопасный участок, который и "вышибает"
> ОС.


Все возможно. Но дело в том, что код внешней проги не мой, и исходников нет. А при запуске из командной строки с параметром нормально срабатывает.


Игорь Шевченко   (2004-11-18 11:13:00) [6]

BiN ©   (18.11.04 11:01) [5]

Невероятно


BiN   (2004-11-18 11:01:00) [7]

>> tyuiop   (18.11.04 08:25)  

Возможно, кто-то знает, как решается следующая проблема.
При запуске внешней программы с помощью CreateProcess (прога досовая) с параметром командной строки комп перезагружается. При вызове без параметра все нормально.


Если при запуске ДОС-приложения из cmd перезагрузки не происходит, то остается только (очень малая) вероятность, что твой код запуска содержит небезопасный участок, который и "вышибает" ОС.
Одни из граблей - это передача в качестве командной строки PChar(cmdLine). Я бы заменил на массив символов с длиной несколько большей, чем длина оригинальной командной строки.
И хотя перезагрузка из-за ошибки доступа к памяти - это из ряда вон, но чем черт не шутит.


tyuiop   (2004-11-18 10:39:00) [8]


> В коде нету ничего, что вызывало бы перезагрузку.


Ну да. Но факт остается фактом.


Игорь Шевченко   (2004-11-18 10:14:00) [9]

В коде нету ничего, что вызывало бы перезагрузку.


tyuiop   (2004-11-18 08:35:00) [10]

Функция, запускающая программу (содержит вызов CreateProcess):
function TMainForm.ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 pi:PROCESS_INFORMATION;
 si:STARTUPINFO;
 cmdLine,Path: String;
begin
 Result := False;
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;
 Result := CreateProcess( nil,          // No module name (use command line).
                       PChar(cmdLine),  // Command line.
                       nil,             // Process handle not inheritable.
                       nil,             // Thread handle not inheritable.
                       False,           // Set handle inheritance  to FALSE.
                       0,               // No creation flags.
                       nil,             // Use parent's environment block.
                       PChar(Path),     // Use parent's starting directory.
                       si,              // Pointer to STARTUPINFO structure.
                       pi );            // Pointer to PROCESS_INFORMATION structure.
 if Result then begin
   CloseHandle(pi.hThread);
 if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
   CloseHandle(pi.hProcess);
 end;
end;

А вот обращение к этой функции:ExecCmd('j:\diasoft\bank\bat\penpodtv.exe d:\qwer.txt',True,False);


NetDigger   (2004-11-18 08:30:00) [11]

Хммм, странно. Приведи код, пожалуйста.


Наверх

Титульная страница Поиск, карта сайта Написать письмо