Перед вами пробный, так сказать ознакомительный, выпуск рассылки "Программирование
для Windows NT на Delphi".
Для начала, что в ней будет, а чего не будет. Не будет баз данных, "иконок у часиков",
практически не будет VCL. Будет WinAPI. Но то только часть, касающаяся только NT.
(сразу хочу заметить, что под Windows NT я имею в виду не только NT4, но и 2000, XP
и будущие версии (на счет младших не обещаю :)).
Не смотря на кажущуюся узость темы, она не такая уж и узкая. Даже скорее очень широкая -
сервисы, сеть, администрирование, реестр, журнал событий, WMI, безопасность, шифрование,
NTFS/EFS и многое другое...
Даже если вы ничего не пишете специально для NT, то эта рассылка тоже может быть Вам
полезна. Самый распространенный пример - написали Вы программку, которая помимо всего
еще и должна перезагружать комп. Написали в программе ExitWindowsEx(...) и довольны,
а у части пользователей (и не малой части!!!) комп не перезагружается. Подписавшимся
на рассылку будет проще - решение проблемы уже у вас в почтовой
программе :).
Хотя это был, наверное, не самый удачный пример :) Решение можно было бы найти в любом
F.A.Q. (ЧаВО). Чаще обсуждаемые вопросы будут "посерьезней" - безопасность, сервисы,
работа с системой и многое, многое другое. Уровень знаний, для которого в основном
будут материалы рассылки - от начинающего до "выше среднего".
Ну и естественно,если в названии упоминается Delphi, то все примеры будут именно на
Object Pascal'е. Хотя рассылка может помочь и "сишникам" и программирующим на других
языках. WinAPI все же не зависит от языка, а теория уж тем более.
Теперь о составе выпусков. Я предполагаю сделать так - основная статья, вопрос/ответ
из FAQ, вопросы с ответами (и без них тоже) от наших читателей, новости сайта (об этом
позже) ну и другое. Очень бы хотелось увидеть в рассылке ваши статьи, заметки, советы
и замечания. В общем, очень бы хотелось поддерживать обратную связь с читателями.
Если вам есть что сказать (или нечего, но хочется :), пишите на
flint@xonix.ru .
Теперь о сайте рассылки. Он расположен на
http://delphi.xonix.ru . Но я постараюсь
не превращать ее в рассылку типа "новости сайта". Большинство материала, который
появится в рассылке, не появится на сайте, кроме как в
архиве рассылки (в архиве новый
выпуск будет появляться намного позже "почтового" выпуска).
Планируемая периодичность рассылки -пока 1 раз в неделю. (Потом возможно чаще).
Вопросы и ответы
Как выключить компьютер, работающий под Windows NT, 2000 или XP?
Этот вопрос был выбран потому, что он стал первой информацией, появившейся на сайте :)
Да и в примере (выше) используется.
// Для выключения локального компьютера необходимо право
// 'Завершение работы системы'. По умолчанию, это право доступно всем пользователям,
// работающим за компьютером.
function LocalShutdown(
bShutdown :Boolean; // Выключение компьютера после перезагрузки
bForceApps :Boolean // Закрывать программы без запроса на сохранения
):Boolean;
var
hToken : THandle;
tkp,PrevState : _TOKEN_PRIVILEGES;
k : Cardinal;
dwFlags : Cardinal;
begin
Result:=false;
// "Включаем" привилегию 'SeShutdownPrivilege'
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PrevState), PrevState, k);
if GetLastError <> ERROR_SUCCESS then exit;
//Определяем выключать или перезагружать компьютер
if bShutdown
then dwFlags:=EWX_SHUTDOWN
else dwFlags:=EWX_REBOOT;
//Определяем выключать или перезагружать компьютер
if bForceApps
then dwFlags:=dwFlags or EWX_FORCE;
// Выходим из Windows (действие определяется значением dwFlags)
if ExitWindowsEx(dwFlags,0)
then Result:=true;
end;
// В отличие от Win9x, в WinNT эта функция работает и в консольных приложениях
Напоследок - фишки Диспетчера задач
Может известные, а может и нет (первую я увидел на rsdn.ru, а вторую вывел опытным путем).
1. Запускаем, например cmd.exe и пишем title program manager. Жмем Enter и наша программа
(сmd.exe) пропадает с экранов радаров (т.е. закладки Приложения вышеназванного программного
продукта. В дельфе подобное достигается вызовом Application.Title='program manager';
2. Берем ЛЮБОЙ файлик (главное не из "каталога с Windows\system32" - там такой уже есть)
и переименовываем его, например, в services.exe, запускаем и
пробуем снять его с закладки Процессы. Но не все так просто - оказывается наша программа
уже системный процесс, при чем критический :)
Как говорится мелочь, а приятно :) А еще возникают мысли, что у программистов, писавших
диспетчер задач были эти самые критические дни :)
На сегодня это все. Хотелось бы вновь попросить писать на
flint@xonix.ru. Критикуйте, предлагайте, советуйте.