![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запустить программу (Отказано в доступе) [D7, WinXP]
Petrovich © (2004-01-21 15:45:00)Здравствуйте! Подскажите, как мне запустить программу из моей программы, чтобы запускалась? :-)
Вот это работает не всегда:
CreateProcess(Nil, // No module name (use command line).
PChar(NewCommand), // Command line.
Nil, // Process handle not inheritable.
Nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
Nil, // Use parent's environment block.
Nil, // Use parent's starting directory.
si, // Pointer to STARTUPINFO structure.
pi) // Pointer to PROCESS_INFORMATION structure.
В данном случае команда, написанная в коммандной строке Far'a, выполняется:
"D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start
а переданная в качестве параметра
NewCommand:='"D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start';
вызывает ошибку №5 - отказано в доступе.
Хотя, по идее, я же войден, как администратор. Кто мне еще может запретить что-то сделать? Я сам себе хозяин: запускаю свои программы и создаю процессы :-)
Нашел еще функцию CreateProcessAsUser, но как ему передать права крутого администратора, не знаю. Первым параметром там идет какой-то хэндл юзера. Его берут, как я понял, из LogonUser. Но опять же я не могу войти с помощью этой функции, как администратор. Говорит, "Ошибка 1314. Клиент не обладает требуемыми правами". Где они валяются, эти права крутого администратора? :-)
Windows XP + Delphi-7, если это важно
Рамиль (2004-01-22 09:43:00) [1]Похоже я не проснулся еще:-D
> путь к файлу CrystalPlayer без " не понял
Просто список параметров пробелами разделяется
Рамиль (2004-01-22 08:43:00) [2]Если работает, но не всегда, то я подозреваю, что не инициализируется структура STARTUPINFO перед вызовом CreateProcess. Вот правильная инициализация, не обижайтесь, если знаете;)
var
Rlst: LongBool;
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Error: integer;
begin
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do
begin
cb := SizeOf(TStartUpInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := SW_SHOWNORMAL;
end;
Rlst := CreateProcess('c:\Program Files\Crystal Player\Crystal.exe', ' "D:\Document\Home\Мои документы\Мои видеозаписи\Ангелы чарли.avi"', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
if Rlst then
with ProcessInfo do begin
WaitForInputIdle(hProcess, INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
end
else Error := GetLastError;
end;
Путь понимается без ", а вот путь к файлу CrystalPlayer без " не понял
GrayFace (2004-01-22 08:10:00) [3]ShellExecute
YuRock (2004-01-21 17:53:00) [4]> AKul © (21.01.04 17:30) [13]
Извините, пожалуйста, но, по-моему, нам не о чем спорить... Я говорю то, что пробовал сам (в том числе - только что).
А Вы бросаетесь какими-то словами типа "загрузчик Win32" и т.д., да еще и пытаетесь меня учить (про WinExec) - не нужно, я по-английски и сам читать умею да и опыт есть.
Если хотите убедиться в моих словах - попробуйте запустить (или остановить) ЛЮБУЮ службу (например - ч-з "Пуск-Выполнить" - это же "загрузчик Win32", я надеюсь :(().
Не хотите - воля Ваша.
AKul (2004-01-21 17:30:00) [5]
> YuRock © (21.01.04 17:09) [12]
Да причем тут это? Формат записи в ярлыках скорее всего остался еще с древней Винды (для совместимости).
Функция WinExec - это тоже пережитки прошлого (использовалась до win32).
А загрузку файла то выполняет загрузчик Win32.
YuRock (2004-01-21 17:09:00) [6]> AKul © (21.01.04 17:03) [11]
Полный-то полный, а ты попробуй в ярлыке написать полный путь без кавычек (если есть длинные имена папок или пробелы)!
Та же ситуация с запуском служб.
AKul (2004-01-21 17:03:00) [7]
> YuRock © (21.01.04 16:58) [10]
>
> Тут дело не в этом было. Запуск служб полного пути требует
> (я такое встречал).
Ты о чем? Тут же везде полный путь передается.
YuRock (2004-01-21 16:58:00) [8]> AKul © (21.01.04 16:52) [7]
Тут дело не в этом было. Запуск служб полного пути требует (я такое встречал).
AKul (2004-01-21 16:57:00) [9]
> Petrovich (21.01.04 16:48) [6]
Да потому что путь в кавычках это формат записи ДЛИННОГО ПУТИ для windows'овского Command.com'а, если без ковычек - то это обычный DOS'овский путь (короткий имена).
Только CreateProcess к этому отношения не имеет.
Проверь код [7].
YuRock (2004-01-21 16:53:00) [10]Попробуйте так (должно заработать):
CreateProcess('"D:\Program Files\Firebird\Firebird_1_5\bin\instsvc.exe"',
' start',
nil,
nil,
False,
0,
nil,
'"D:\Program Files\Firebird\Firebird_1_5\bin"',
si,
pi);
А вообще можно (и, по-моему, лучше) так:
WinExec('instsvc.exe start', SH_HIDE);
AKul (2004-01-21 16:52:00) [11]to YuRock © (21.01.04 16:30) [4]:
> Petrovich прав.
В чем? Если в том что, "если функции неправильно передавать параметры, то она невсегда будет правильно выполняться", тогда да.
Проверь вот такой код на своей машине: (файл Project2.exe должен существовать):
GetStartupInfo(SI);
if(not CreateProcess(Nil, // No module name (use command line).
'D:\Program files\borland\delphi5\projects\project2.exe FirstParameter', // Command line.
Nil, // Process handle not inheritable.
Nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
Nil, // Use parent's environment block.
Nil, // Use parent's starting directory.
si, // Pointer to STARTUPINFO structure.
pi) // Pointer to PROCESS_INFORMATION structure.
)then ShowMessage(IntToStr(GetLastError));
А потом поставь кавычки и запусти опять...
Почувствуй разницу.
Petrovich (2004-01-21 16:48:00) [12]Сделал наконец-то! Через одно место, правда, но тем не менее, работает :-)
Пишу, короче, команду, которую надо выполнить, в командный файл Cmd.cmd:
"D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start >>D:\Base\Log.log
А потом уже передаю запуск этого командного файла с помощью программы
cmd.exe /C Cmd.cmd
моему создаваемому процессу. Тогда все работает и в лог пишется.
Кто бы теперь мне еще объяснил, почему из командного файла работает, а напрямую из программы - нет :-)
Petrovich (2004-01-21 16:32:00) [13]Так я же администратор :-)
YuRock (2004-01-21 16:30:00) [14]> AKul © (21.01.04 16:23) [3]
Petrovich прав.
> Petrovich
Дело в том, что, скорее всего, у Вас действительно не хватает доступа к старту/стопу служб.
AKul (2004-01-21 16:23:00) [15]
> Petrovich (21.01.04 16:16) [2]
> Тогда она говорит, что не найдена программа "D:\Program".
Кто это такое говорит? Не может такого быть!
Запусти код и увидишь.
Petrovich (2004-01-21 16:16:00) [16]Тогда она говорит, что не найдена программа "D:\Program".
Там же в пути пробел, поэтому надо весь путь заключать в кавычки
AKul (2004-01-21 16:02:00) [17]Конечно она будет работать не всгеда, особенно если ей передавать неверные параметры!
А вот, если вместо
NewCommand:='"D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start';
попробовать
NewCommand:='D:\Program Files\Firebird\Firebird_1_5\bin\instsvc.exe start';
то думаю будет работать всегда :)