-
Здравствуйте! Надо из моей программы запустить Блокнот с файлом 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 - все ОК. Что можно сделать? Спасибо.
-
> Если программу запускать из Delphi, то вываливается на строке > CreateProcess... с ошибкой в
Ага. Тоже вылазит ошибка: DrWeb: D:\Program Files\Borland\Delphi7\Projects\Project1.exe - инфицирован Trojan.DownLoad.47164 видимо не нравится, что программа вызывает функцию CreateProcess =))
Ну а если серьезно, что за ошибка? Воспроизводится, если создать проект с нуля?
-
> [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 исчезает :)
-
> 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;
-
> [3] Юрий Зотов © (05.10.09 05:51) > У него же D7, юникод тут вряд ли при чем. Этот же самый код у меня работает без проблем (D7, XP)
Во черт. Не заметила. Не если его код копипайстнуь в Delphi 2010, то получаем AV.
-
Забыл сказать: ошибки только при запуска по User, под Admin - нет.
-
> newbart (05.10.09 09:34) [5]
Нужен текст сообщения об ошибке.
if Win32Check(CreateProcess(...)) then ...
-
> Надо из моей программы запустить Блокнот с файлом tmp.txt
сорри, а shellexecute() не канает?
|