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