![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов 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]Хммм, странно. Приведи код, пожалуйста.