Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Как запустить программу (Отказано в доступе)   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
4-1075098320
EcoloRa
2004-01-26 09:25
2004.04.04
Вопрос по установке ловушек


1-1079691160
ashnurov
2004-03-19 13:12
2004.04.04
ListBox


7-1074608063
MAXHO
2004-01-20 17:14
2004.04.04
LPT-порт и прерывания


1-1078577124
Anonim
2004-03-06 15:45
2004.04.04
Привязка проги к компютеру


1-1079192106
Goida
2004-03-13 18:35
2004.04.04
Элементы TRxDBLookupCombo