Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1078221353
Wild
2004-03-02 12:55
2004.04.04
Update DBF


14-1078658912
Undert
2004-03-07 14:28
2004.04.04
Flash


14-1078900514
Карелин Артем
2004-03-10 09:35
2004.04.04
Полетела Флэшка. Что делать?


1-1079512182
Алексей Петухов
2004-03-17 11:29
2004.04.04
Excel в стиле R1R1


1-1079605953
alextov
2004-03-18 13:32
2004.04.04
Перенос проекта из Delphi 6 в Delphi 5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский