Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запустить программу (Отказано в доступе) [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';

то думаю будет работать всегда :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо