Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2008, 21:21   #1
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию Нужен ли CloseHandle?

Здравствуйте. Скажите пожалуйста нужен ли в конце этой процедуры CloseHandle?
Код:
procedure ShutdownComputer;
var
  hToken: THandle;
  tkp, prevst: TTokenPrivileges;
  rl: DWORD;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, hToken);
  LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
  tkp.PrivilegeCount := 1;
  tkp.Privileges[0].Attributes := 2;
  AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(prevst), prevst, rl);
  ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
Я ее нашел поиском по форуму, и не до конца понимаю что к чему в ней
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Старый 15.07.2008, 21:49   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

По моему нет смысла, потому что после запуска функции все процессы включая этот в принудительном порядке по закрывались.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 15.07.2008, 22:01   #3
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Ясно, спасибо.А что значит Project1.dpr(22): Ambiguous overloaded call to 'AdjustTokenPrivileges' ? Если не трудно, объясните пожалуйста
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Старый 15.07.2008, 22:13   #4
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Дословный перевод
Неоднозначный перегруженный вызов 'AdjustTokenPrivileges'
Толком не знаю, у меня этого предупреждения нет.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 15.07.2008, 22:16   #5
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Я не понял что ето , но понял что это изза моей мании делать все в консоли.. Сделал в форме все работает Прошу прощения
Если кто нибудь знает, изза чего эта ошибка, и как ее исправить(если можно конечно) напишите пожалуйста
Прогрессирующий чайник..

Последний раз редактировалось The_Darkness; 15.07.2008 в 22:18.
The_Darkness вне форума Ответить с цитированием
Старый 10.11.2010, 18:17   #6
Yauhen_m
Новичок
Джуниор
 
Регистрация: 10.11.2010
Сообщений: 1
По умолчанию

Наверное потому, что не определены значения переменных prevst и rl.
Yauhen_m вне форума Ответить с цитированием
Старый 10.11.2010, 18:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
нужен ли в конце этой процедуры CloseHandle?
Во-первых в SDK ничего не сказано о его необходимости
Во-вторых, ты же машину выключаешь, какой смысл еще и хендлы закрывать? Это же не файл, в который писать нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2010, 11:00   #8
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Все равно лишним код не будет, особенно если учесть возврат от WM_QUERYENDSESSION, надо всегда планировать всевозможные ситуации.
Exception вне форума Ответить с цитированием
Старый 11.11.2010, 13:38   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вызов CloseHandle - нужен.

Если, конечно, вы хотите писать нормальный качественный код, а не говно-код (см. пример два).

Цитата:
Ambiguous overloaded call to 'AdjustTokenPrivileges'
Это значит, что в программе есть две AdjustTokenPrivileges, а компилятор не может понять, какую из них вызывать, потому что параметры, которые ты в неё передаёшь, подходят обоим вариантам.

Это бывает в двух случаях:
- у тебя подключено два разных модуля, в обоих из них есть overload-варианты AdjustTokenPrivileges. Решение в этом случае - явно указать префикс модуля. Например: Windows.AdjustTokenPrivileges. Или JvWindows.AdjustTokenPrivileges. Или... кто там у тебя там, я не знаю.

- в одном модуле есть несколько вариантов AdjustTokenPrivileges, но один или несколько параметров, которые ты передаёшь в процедуру, подходят под несколько вариантов. Обычно это бывает когда ты не указываешь опциональные параметры (не твой случай, но вообще бывает), либо когда параметры имеют слишком общий тип, который можно преобразовать как к одному типу (в первой AdjustTokenPrivileges), так и ко второму (во второй AdjustTokenPrivileges). Как решить - Ctrl + щелчок на AdjustTokenPrivileges и смотрим, какие в точности параметры она требует. Затем даём ей именно эти параметры, а не такие, которые лишь совместимы с ними.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Во-первых в SDK ничего не сказано о его необходимости.
Чёрным по белому написано:
Цитата:
Close the access token handle returned through the TokenHandle parameter by calling CloseHandle.
"Just follow the rules - nobody gets hurt" ©
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 11.11.2010 в 13:53.
GunSmoker вне форума Ответить с цитированием
Старый 11.11.2010, 20:45   #10
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

не нужен, говно-код винды всё закроет сам

add
некрофилизм процветает )

Последний раз редактировалось litrovith; 11.11.2010 в 20:53.
litrovith вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет Михаил Юрьевич Общие вопросы Delphi 3 04.05.2008 21:52
Нужен программист NFS Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 11.03.2008 21:10
нужен исходник xakkkkker Общие вопросы Delphi 1 14.02.2008 16:39