Недавно я, как и обещал нескольими постами ранее, взялся за написание программы EasyTask. Надо сказать, что этой мой первый опыт создания большой программы на C#, поэтому некоторые вещи мне кажутся довольно необычными, а некоторые — вообще непонятными. Взять, например, GDI+ с его, казалось бы, удобными обёртками для выполнения графических операций. Они действительно удобные, ничего не скажешь, проблемы возникают в ситуациях, когда нужно нарисовать довольно много и довольно быстро
. Взять, например, фон для главного окна:
Недавно заметил одну весьма неприятную особенность Windows 7: если программа тербует повышенных прав для запуска, её нельзя автоматически запускать при старте Windows. Причём, неважно каким образом установлено «требование» повышенных прав: через манифест, или в свойствах файла на закладке «Совместимасть». Учитывая тот факт, что для нормального функционирования моего проекта «Oculus» его управляющая программа должна быть запущена с правами администратора, такое положение дел меня совершенно не устраивало. Сегодня я реализовал небольшой «обходной манёвр», быть может, не очень элегантный, но работающий.
Суть метода заключается в том, что сначала программа запускается с обычными, «урезанными» правами. При запуске она проверяет наличие определённого аргумента, и, в случае его отсутствия, запускает сама себя с повышенными правами и с тем самым аргументом. В коде это выглядит примерно так:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
SHELLEXECUTEINFO TempInfo = {0};
...
if (!Service.has_arg(_T("/admin")))
{
TempInfo.cbSize = sizeof(SHELLEXECUTEINFO);
TempInfo.fMask = 0;
TempInfo.hwnd = NULL;
TempInfo.lpVerb = _T("runas");
TempInfo.lpFile = Service.AppPath();
TempInfo.lpParameters = _T("/admin");
TempInfo.lpDirectory = Service.AppFolder();
TempInfo.nShow = SW_NORMAL;
ShellExecuteEx(&TempInfo);
return 0;
}
...
}
Здесь используется функция ShellExecuteEx с недокументированным параметром «runas», который и позволяет запустить программу с повышенными правами. Service — это мой «мини-фреймворк», содержащий несколько простых полезных функций.
В результате, Windows думает, что запускает программу с урезанными правами, в то время как она коварно перезапускается с правами администратора
.
Решил написать простенькую реализацию паттерна «Signals and Slots«. Получилось действительно очень просто: количество параметров в сигналах ограничено одной штукой, void тоже не поддерживается. Тем не менее, вся реализация занимет всего 120 строк в одном заголовочном файле, и, что самое главное, полностью удовлетворяет моим требованиям
sigslot.zip (5 Кб) – может кому пригодится
