Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизКак запустить программу (Отказано в доступе) Найти похожие ветки
← →
Petrovich (2004-01-21 15:45) [0]Здравствуйте! Подскажите, как мне запустить программу из моей программы, чтобы запускалась? :-)
Вот это работает не всегда:
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, если это важно
← →
AKul © (2004-01-21 16:02) [1]Конечно она будет работать не всгеда, особенно если ей передавать неверные параметры!
А вот, если вместо
NewCommand:=""D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start";
попробовать
NewCommand:="D:\Program Files\Firebird\Firebird_1_5\bin\instsvc.exe start";
то думаю будет работать всегда :)
← →
Petrovich (2004-01-21 16:16) [2]Тогда она говорит, что не найдена программа "D:\Program".
Там же в пути пробел, поэтому надо весь путь заключать в кавычки
← →
AKul © (2004-01-21 16:23) [3]
> Petrovich (21.01.04 16:16) [2]
> Тогда она говорит, что не найдена программа "D:\Program".
Кто это такое говорит? Не может такого быть!
Запусти код и увидишь.
← →
YuRock © (2004-01-21 16:30) [4]> AKul © (21.01.04 16:23) [3]
Petrovich прав.
> Petrovich
Дело в том, что, скорее всего, у Вас действительно не хватает доступа к старту/стопу служб.
← →
Petrovich (2004-01-21 16:32) [5]Так я же администратор :-)
← →
Petrovich (2004-01-21 16:48) [6]Сделал наконец-то! Через одно место, правда, но тем не менее, работает :-)
Пишу, короче, команду, которую надо выполнить, в командный файл Cmd.cmd:
"D:\Program Files\Firebird\Firebird_1_5\bin"\instsvc.exe start >>D:\Base\Log.log
А потом уже передаю запуск этого командного файла с помощью программы
cmd.exe /C Cmd.cmd
моему создаваемому процессу. Тогда все работает и в лог пишется.
Кто бы теперь мне еще объяснил, почему из командного файла работает, а напрямую из программы - нет :-)
← →
AKul © (2004-01-21 16:52) [7]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));
А потом поставь кавычки и запусти опять...
Почувствуй разницу.
← →
YuRock © (2004-01-21 16:53) [8]Попробуйте так (должно заработать):
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:57) [9]
> Petrovich (21.01.04 16:48) [6]
Да потому что путь в кавычках это формат записи ДЛИННОГО ПУТИ для windows"овского Command.com"а, если без ковычек - то это обычный DOS"овский путь (короткий имена).
Только CreateProcess к этому отношения не имеет.
Проверь код [7].
← →
YuRock © (2004-01-21 16:58) [10]> AKul © (21.01.04 16:52) [7]
Тут дело не в этом было. Запуск служб полного пути требует (я такое встречал).
← →
AKul © (2004-01-21 17:03) [11]
> YuRock © (21.01.04 16:58) [10]
>
> Тут дело не в этом было. Запуск служб полного пути требует
> (я такое встречал).
Ты о чем? Тут же везде полный путь передается.
← →
YuRock © (2004-01-21 17:09) [12]> AKul © (21.01.04 17:03) [11]
Полный-то полный, а ты попробуй в ярлыке написать полный путь без кавычек (если есть длинные имена папок или пробелы)!
Та же ситуация с запуском служб.
← →
AKul © (2004-01-21 17:30) [13]
> YuRock © (21.01.04 17:09) [12]
Да причем тут это? Формат записи в ярлыках скорее всего остался еще с древней Винды (для совместимости).
Функция WinExec - это тоже пережитки прошлого (использовалась до win32).
А загрузку файла то выполняет загрузчик Win32.
← →
YuRock © (2004-01-21 17:53) [14]> AKul © (21.01.04 17:30) [13]
Извините, пожалуйста, но, по-моему, нам не о чем спорить... Я говорю то, что пробовал сам (в том числе - только что).
А Вы бросаетесь какими-то словами типа "загрузчик Win32" и т.д., да еще и пытаетесь меня учить (про WinExec) - не нужно, я по-английски и сам читать умею да и опыт есть.
Если хотите убедиться в моих словах - попробуйте запустить (или остановить) ЛЮБУЮ службу (например - ч-з "Пуск-Выполнить" - это же "загрузчик Win32", я надеюсь :(().
Не хотите - воля Ваша.
← →
GrayFace © (2004-01-22 08:10) [15]ShellExecute
← →
Рамиль © (2004-01-22 08:43) [16]Если работает, но не всегда, то я подозреваю, что не инициализируется структура 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 без " не понял
← →
Рамиль © (2004-01-22 09:43) [17]Похоже я не проснулся еще:-D
> путь к файлу CrystalPlayer без " не понял
Просто список параметров пробелами разделяется
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c