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

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

Ошибки при запуске приложений из Delphi [D7, WinXP]


newbart ©   (2009-10-04 17:26:00) 

Здравствуйте!
Надо из моей программы запустить Блокнот с файлом tmp.txt, пишу такой код:
var
 si: TStartupInfo;
 pi: TProcessInformation;
 CmdLine: String;
begin
 CmdLine:= 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';

 FillChar(si, SizeOf(TStartupInfo), #0);
 si.cb:= SizeOf(TStartupInfo);
 si.dwFlags:= STARTF_USESHOWWINDOW;
 si.wShowWindow:= Windows.SW_SHOWNORMAL;

 CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS,
               nil, nil, si, pi);
end;


Если программу запускать из Delphi, то вываливается на строке CreateProcess... с ошибкой в

отладчик CPU.
Если программу запускать НЕ из Delphi - все ОК.
Что можно сделать?
Спасибо.


Leonid Troyanovsky   (2009-10-18 23:26:00) [1]


> newbart   (16.10.09 21:34) [19]

> Если создан новый проект и в нем НЕ работает - он "чистый"?

Вновь созданный проект - в студию.
Только, чур, без излишеств - токмо касаемо CreateProcess.

--
Regards, LVT.


newbart   (2009-10-16 21:34:00) [2]

To Leonid Troyanovsky (12.10.09 21:49) [18]
Если создан новый проект и в нем НЕ работает - он "чистый"?


Leonid Troyanovsky   (2009-10-12 21:49:00) [3]


> newbart   (12.10.09 19:29) [17]

> Что делать-то?

Искать наведенную ошибку (AV в иных местах, скажем).
Но, это лишь в случае, если [3, 6] в "чистом" проекте работает.

--
Regards, LVT.


newbart   (2009-10-12 19:29:00) [4]

Что делать-то?


  (2009-10-11 20:14:00) [5]

Удалено модератором


Германн   (2009-10-11 03:27:00) [6]

Удалено модератором


  (2009-10-11 02:35:00) [7]

Удалено модератором


Германн   (2009-10-11 02:30:00) [8]

Удалено модератором


  (2009-10-11 02:21:00) [9]

Удалено модератором


Leonid Troyanovsky   (2009-10-10 22:50:00) [10]


> newbart   (10.10.09 06:48) [10]

> А в чем больно-то?

В мозге.

--
Regards, LVT.


newbart   (2009-10-10 06:48:00) [11]

> Игорь Шевченко  (07.10.09 13:22) [9]
А в чем больно-то?


Игорь Шевченко   (2009-10-07 13:22:00) [12]


> Да какой там текст - CPU window выходит


Больно слышать


newbart   (2009-10-07 13:13:00) [13]

> Юрий Зотов (05.10.09 12:27) [6]
Да какой там текст - CPU window выходит.

> MonoLife  (05.10.09 16:34) [7]
И на ShellExecute() и на WinExec тоже самое. Вся проблема здесь при запуске под User-ом, под Admin - нет.


MonoLife   (2009-10-05 16:34:00) [14]


> Надо из моей программы запустить Блокнот с файлом tmp.txt

сорри, а shellexecute() не канает?


Юрий Зотов   (2009-10-05 12:27:00) [15]

> newbart   (05.10.09 09:34) [5]

Нужен текст сообщения об ошибке.

if Win32Check(CreateProcess(...)) then ...


newbart   (2009-10-05 09:34:00) [16]

Забыл сказать: ошибки только при запуска по User, под Admin - нет.


Riply   (2009-10-05 06:20:00) [17]

> [3] Юрий Зотов ©   (05.10.09 05:51)
> У него же D7, юникод тут вряд ли при чем. Этот же самый код у меня работает без проблем (D7, XP)

Во черт. Не заметила.
Не если его код копипайстнуь в Delphi 2010, то получаем AV.


Юрий Зотов   (2009-10-05 05:51:00) [18]

> Riply ©   (05.10.09 05:31) [2]

У него же D7, юникод тут вряд ли при чем. Этот же самый код у меня работает без проблем (D7, XP):

procedure TForm1.FormDblClick(Sender: TObject);
var
 si: TStartupInfo;
 pi: TProcessInformation;
 CmdLine: string;
begin
 CmdLine := 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';
 ZeroMemory(@si, SizeOf(si));
 si.cb := SizeOf(si);
 if CreateProcess(nil, PChar(CmdLine), nil, nil, False, 0, nil, nil, si, pi) then
 begin
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess)
 end
end;


Riply   (2009-10-05 05:31:00) [19]

> [0] newbart   (04.10.09 17:26)
> Что можно сделать?

Для начала, попробуем Help почитать :)
И гласит он следующее:
lpCommandLine
[in, out] The command line to be executed. The maximum length of this string is 32K characters.
Windows 2000:  The maximum length of this string is MAX_PATH characters.
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.


Тогда, пробуем "подогнать" наш вызов под его несуразные требования :)
("несуразные" - imho. Имею право на свое мнение:) )
Пишем что-то такого типа:
var
si: TStartupInfo;
pi: TProcessInformation;
CmdLine: String;
pCmdLine: PChar;
begin
 inherited;
CmdLine:= 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';
pCmdLine := @CmdLine[1];
FillChar(si, SizeOf(TStartupInfo), #0);
si.cb:= SizeOf(TStartupInfo);
si.dwFlags:= STARTF_USESHOWWINDOW;
si.wShowWindow:= Windows.SW_SHOWNORMAL;

if CreateProcess(nil, pCmdLine, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
 begin
  ProcessInfo_CloseHandles(@pi);
  ShowMessage(pCmdLine);
 end
else ShowMessage(SysErrorMessage(GetLastError));
end;


К моему великому удивлению ACCESS_VIOLATION исчезает :)


Loginov Dmitry   (2009-10-04 23:12:00) [20]

> Если программу запускать из Delphi, то вываливается на строке
> CreateProcess... с ошибкой в


Ага. Тоже вылазит ошибка:
DrWeb: D:\Program Files\Borland\Delphi7\Projects\Project1.exe - инфицирован Trojan.DownLoad.47164
видимо не нравится, что программа вызывает функцию CreateProcess =))

Ну а если серьезно, что за ошибка? Воспроизводится, если создать проект с нуля?


Наверх

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