Форум: "Прочее";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизПросьба проверить код на Windows Vista Найти похожие ветки
← →
tmp (2007-09-22 14:20) [0]У Вас работает этот код без пробела перед c:\New_text_file.txt ?
procedure TForm1.Button1Click(Sender: TObject);
var
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
WinDir: array[0..MAX_PATH] of Char;
begin
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, SizeOf(pi));
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEOFFFEEDBACK;
si.wShowWindow := SW_SHOWNORMAL;
if GetWindowsDirectory(WinDir,SizeOf(WinDir)) > 0 then
if CreateProcess(PChar(WinDir + "\notepad.exe"), "c:\New_text_file.txt", nil,
nil, False, 0, nil, nil, si, pi)
then
ShowMessage(IntToStr(Integer(CloseHandle(pi.hProcess))));
end;
← →
Denis_ © (2007-09-22 15:21) [1]Да.
← →
tmp (2007-09-22 15:40) [2]
> Denis_ © (22.09.07 15:21) [1]
>
> Да.
Спасибо.
С Win9x до Xp SP2 - не пашет.
← →
Юрий Зотов © (2007-09-22 16:32) [3]Сорри, но код безобразный.
:-(
← →
tmp (2007-09-22 20:29) [4]
> Юрий Зотов © (22.09.07 16:32) [3]
>
> Сорри, но код безобразный.
> :-(
>
Я не профи, но вопрос был в другом: работает или нет. Кстати, а что не так?
← →
Вася Правильный (2007-09-22 20:40) [5]
> без пробела перед c:\New_text_file.txt ?
пробел проверяем в константе или перед ней?
← →
Anatoly Podgoretsky © (2007-09-22 22:16) [6]
> Кстати, а что не так?
Отсутствие обработки ошибок.
← →
Юрий Зотов © (2007-09-22 22:40) [7]> tmp (22.09.07 20:29) [4]
> Кстати, а что не так?
1. Много лишнего.
2. Утечка ресурсов.
3. Нет обработки ошибок.
Сравните - этот код делает то же самое:
procedure TForm1.Button1Click(Sender: TObject);
var
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
begin
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
Win32CheckCreateProcess(nil, "notepad.exe c:\New_text_file.txt", nil, nil, False, 0, nil, nil, si, pi));
CloseHandle(pi.hThread)
CloseHandle(pi.hProcess)
end;
← →
Юрий Зотов © (2007-09-22 22:42) [8]Скобку пропустил:
Win32Check(...
← →
tmp (2007-09-22 23:42) [9]Насчет обработки ошибок - это всего лишь тестовый код. Про CloseHandle(pi.hThread) забыл, а параметры lpApplicationName и lpCommandLine нужны для проверки, т.к функция без начального пробела перед параметром lpCommandLine почему-то не работает в Windows 9x/Me/XP/XPSP2, хотя в MSDN ничего не сказано на этот счет.
← →
исследователь © (2007-09-23 00:37) [10]
> Юрий Зотов © (22.09.07 22:40) [7]
А почему зеромемори для pi не вызываете?
← →
Anatoly Podgoretsky © (2007-09-23 11:38) [11]> исследователь (23.09.2007 00:37:10) [10]
Из-за бессмысленности подобной операции.
← →
исследователь © (2007-09-23 12:39) [12]Значит, si обнулять не бессмысленно, а pi - бессмысленно? Обоснуйте.
← →
Юрий Зотов © (2007-09-23 12:55) [13]> tmp (22.09.07 23:42) [9]
> функция без начального пробела перед параметром lpCommandLine
> почему-то не работает в Windows 9x/Me/XP/XPSP2
Я этот код использовал десятки раз - все работало. Похоже, причина в чем-то другом.
> исследователь © (23.09.07 12:39) [12]
Обнулять si нужно потому, что эта запись содержит ВХОДНЫЕ для CreateProcess данные. Если в них будет мусор, то CreateProcess или не сработает вообще, или сработает случайным образом (что еще хуже).
А pi содержит два поля и оба они заполняются внутри самой CreateProcess. Поэтому безразлично, что эти поля содержали перед вызовом - а если так, то операция их очистки лишняя.
← →
Юрий Зотов © (2007-09-23 12:58) [14]> pi содержит два поля
Сорри, не два, а четыре. Но это ни на что не влияет - все четыре все равно заполняет сама CreateProcess, поэтому чистить их перед вызовом бессмысленно.
← →
исследователь © (2007-09-23 14:07) [15]Спасибо.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c