Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Приоритет запускаемой программы или хэндл процесса Добавлено: 29.07.05 19:59  

Автор вопроса:  kolyanoid
Рылся в поиске, но толком своей проблемы решить не смог :(

Проблема:
Запускаю прогу SHELL'ом и получаю ProcessID. Прога - это отдельное окно с известным заголовком. Нужно установить приоритет выполнения этого процесса на минимальный...

Нашёл всё, что надо: апи функции и значения параметров:
Const HIGH_PRIORITY_CLASS = &H80
Const IDLE_PRIORITY_CLASS = &H40
Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long


Вот... Подсунул вместо hProcess мой ProcessID и приоритет на Idle... Функция возвращает 0 (запаролась, значит) и приоритет остаётся на "среднем"... Через диспетчер задач приоритет устанавливается и я добиваюсь того результата, который мне нужен от этого приоритета...

Я даже начал думать что ProcessID и hProcess (хэндл) не одно и то же, но не нашёл способов узнать этот самый хэндл.

Народ, помогите плиз! Что я не так делаю?

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 Sur



ICQ: 1249088 

Вопросов: 10
Ответов: 304
 Web-сайт: sur.hotbox.ru/
 Профиль | | #1
Добавлено: 29.07.05 21:20
Говорят так прав на изменение нет.
Тут модуль, работает.
http://www.novicksoftware.com/TipsAndTricks/Tips-Lower-your-Process-Priority-with-the-Win32-API.htm

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 29.07.05 21:33
Я даже начал думать что ProcessID и hProcess (хэндл) не одно и то же, но не нашёл способов узнать этот самый хэндл.

Это и есть не одно и то же :)))

ищи по теме: "Create Process, а что дальше !!!
" на этом форуме.

Ответить

Номер ответа: 3
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #3 Добавлено: 29.07.05 23:10
Ух, ребяты :) Долго я насиловал ВБ, но своего добился :) Вот как:


'Получаем ID процесса при запуске проги
ProcessID = Shell(::путь_к_файлу::)
'Узнаём хэндл этого процесса по его ID
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessID)
'Устанавливаем приоритет процесса
Res = SetPriorityClass(hProcess, IDLE_PRIORITY_CLASS)


Вот и всё :) оказалось очень просто :)

Константы при OpenProcess:
Public Const PROCESS_QUERY_INFORMATION = 1024
Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SYNCHRONIZE = &H100000
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const hNull = 0
Public Const WIN95_System_Found = 1
Public Const WINNT_System_Found = 2
Public Const Default_Log_Size = 10000000
Public Const Default_Log_Days = 0
Public Const SPECIFIC_RIGHTS_ALL = &HFFFF
Public Const STANDARD_RIGHTS_ALL = &H1F0000


Константы при SetPriorityClass:
Const HIGH_PRIORITY_CLASS = &H80
Const IDLE_PRIORITY_CLASS = &H40
Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100

Enjoy :)

P.S.
Мелкомягким надо памятник поставить за такую неразбериху с ProcessID, hProcess и функцией OpenProcess... блин :(

Ответить

Номер ответа: 4
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #4 Добавлено: 29.07.05 23:19
Забыл:
ВСЕМ БОЛЬШОЙ ПАСИБ :)

Ответить

Номер ответа: 5
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 30.07.05 07:35
Небольшие замечания.

Во-первых, ты, по всей видимости, админ на своей машине. Потому что иначе открыть процесс на ALL_ACCESS сложно.
Во-вторых, достаточно права PROCESS_SET_INFORMATION.
В-третьих, можно избежать всего этого, запуская процесс не через shell, а через CreateProcess, поскольку она как раз возвращает HPROCESS с правом ALL_ACCESS.

Ответить

Номер ответа: 6
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #6 Добавлено: 30.07.05 11:53
1) Да, я админ...

2) Спасиба :) Я просто выбрал из всех параметров такой, "чтоб уж наверняка" и воспользовался первым правилом сисадмина: "работает - не трогай!" :)) Спасибо, это очень пригодится. А это право (PROCESS_SET_INFORMATION) не требует привилегий админа?

3) Хм... там чего-то параметров жутко много :)) А так, даже и не знал об этом - спасиба :) Но так проще. Да и в проге мне нужен ID процесса (а в последствии и хэндл тоже, о чём тут и спросил)

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 30.07.05 12:39
2. В общем случае неизвестно, т.к. это зависит от локальных политик безопасности. Но чем меньше требуемые программой привилегии, тем лучше.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам