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

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

CreateProcess Ошибка! [D5, Win95/98, Win2k]


Борис ©   (2002-11-21 13:25:00) 

procedure TForm1.Button1Click(Sender: TObject);
var st_startupinfo:STARTUPINFO;
str_lpprocessinformation:process_information;
begin

st_startupinfo.lpReserved:=nil;
st_startupinfo.lpTitle:=nil;
st_startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
st_startupinfo.cbReserved2:=0;
st_startupinfo.lpReserved:=nil;

if CreateProcess(nil, "c:\program files\Internet explorer\iexplore.exe c:\index.html" ,nil, nil, TRUE, Normal_Priority_Class, nil , nil, st_startupinfo, str_lpprocessinformation)= false then
begin
showmessage("Процесс не создан!");
end;
end;

Открывается IE с файликом index.html, но сразу выскакивает:
Программа вып. нед. операцию и будет закрыта:
Программа IEXPLORE вызвала сбой при обращении к странице памяти
в модуле MSVCRT20.DLL по адресу 0167:7fc37939.
Регистры:
EAX=8190501c CS=0167 EIP=7fc37939 EFLGS=00010202
EBX=0000c000 SS=016f ESP=01eaef5c EBP=01eaefb0
ECX=2063fbff DS=016f ESI=8197d494 FS=769f
EDX=bffc9490 ES=016f EDI=7fc69000 GS=0000
Байты по адресу CS:EIP:
f3 a5 8b c8 83 e1 03 f3 a4 8b 45 fc 3d 00 01 00
Содержимое стека:
00000000 0000040a 0000c000 83e4047f 02006b6f 6b6f8334 00000000 05ef2784 05eff824 84500007 01e86b6f f7d60209 05ef0776 07760000 01dd0209 00000d70

Потом такое-же окно для модуля Kernel.

В чем ошибка? И еще, почему не срабатывает, если в первом параметру указываешь исполняемый, а во втором параметр?
CreateProcess("c:\program files\Internet explorer\iexplore.exe, "c:\index.html" ,nil, nil, TRUE, Normal_Priority_Class, nil , nil, st_startupinfo, str_lpprocessinformation) ???


Борис   (2002-11-21 15:02:00) [1]

Большое спасибо! Код упростил.

а теперь вот-такой вопрос:
Как с помощью ShelExecute изменить параметр, чтобы уже открытый эсплорер заставить открыть файл index2.html? Прочитал описание, но там вроде только на открытие папки/файла, а как быть в данном случае?


Юрий Зотов   (2002-11-21 14:57:00) [2]

Зачем выполнять лишние действия и действия, которые и без того выполняются по умолчанию?

1. ProcessInformation можно не чистить.
2. Для Вашего случая в StartupInfo после чистки достаточно заполнить только CB.

В итоге код упростится, а результат будет тот же.


Борис   (2002-11-21 14:37:00) [3]

Все работает! Сделал так:

ZeroMemory(@st_startupinfo, sizeof(st_startupinfo));
ZeroMemory(@str_lpprocessinformation, sizeof(str_lpprocessinformation));

st_startupinfo.cb := SizeOf(st_startupinfo);
st_startupinfo.wShowWindow :=SW_SHOWNORMAL;
st_startupinfo.lpReserved:=nil;
st_startupinfo.lpTitle:=nil;
st_startupinfo.dwFlags := STARTF_USESHOWWINDOW;
st_startupinfo.cbReserved2:=0;
st_startupinfo.lpReserved:=nil;

if CreateProcess(Pchar(Eprocess.text), PChar(" "+Edit1.text), nil, nil, TRUE, Normal_Priority_Class, nil , nil, st_startupinfo, str_lpprocessinformation)= false then
begin
showmessage("Процесс не создан!");
end;


Внук   (2002-11-21 14:25:00) [4]

Пока не почистите структуры и не укажете их размеры, работать все равно не будет.
См. KoluChi © (21.11.02 13:49)


Борис   (2002-11-21 13:50:00) [5]

Kudatsky, спасибо за ответ, однако нужно именно CreateProcess!


KoluChi   (2002-11-21 13:49:00) [6]

Рабочий код:
var
PrInfo: PROCESS_INFORMATION;
StInfo: STARTUPINFO;
ExitCode: DWord;
begin
ZeroMemory(@StInfo, sizeof(StInfo));
with StInfo do
begin
cb := SizeOf(StInfo);
wShowWindow := WindowState;
dwFlags := STARTF_USESHOWWINDOW;
end;
if not CreateProcess(nil, PChar(ExecLine), nil, nil, False, CREATE_NEW_PROCESS_GROUP, nil, nil, StInfo, PrInfo) then Exit;
WaitForSingleObject(PrInfo.hProcess, INFINITE);
CloseHandle(PrInfo.hProcess);
CloseHandle(PrInfo.hThread);


Kudatsky   (2002-11-21 13:46:00) [7]

Попробуй функции FileExecute или FileExecuteWait из RxLib. Я их использую так:

Path:=HelpPath+"\Index.htm";
if FileExecute(Path, "", "", esNormal) <= 32 then
ShowMessage("Не запускается Internet Browser");


Борис   (2002-11-21 13:27:00) [8]

Про второй вопрос уже сам понял (пока писал) ;-)
Надо было поставить пробел перед параметром:

CreateProcess("c:\program files\Internet explorer\iexplore.exe, " c:\index.html" ,nil, nil, TRUE, Normal_Priority_Class, nil , nil, st_startupinfo, str_lpprocessinformation)

А вот вопрос об ошибке в силе!


Наверх

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