Приведу небольшой пример реализации сервиса и подключения к рабочему столу. В данном примере я опустил всю обработку ошибок.
#include <windows.h>
void WINAPI MyServiceStart(DWORD, LPTSTR *);
void WINAPI MyServiceCtrlHandler(DWORD);
void ServiceWorkFunction();
SERVICE_STATUS_HANDLE MyServiceStatusHandle;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
SERVICE_TABLE_ENTRY DispatchTable[] = {{"MyService", MyServiceStart},
{NULL, NULL}};
//Вызываем точку входа сервиса
StartServiceCtrlDispatcher(DispatchTable);
}
void WINAPI MyServiceStart(DWORD, LPTSTR *)
{
SERVICE_STATUS MyServiceStatus = {0};
MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
//Регистрируем обработчик событий сервиса
MyServiceStatusHandle = RegisterServiceCtrlHandler("MyService",
MyServiceCtrlHandler);
SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus);
ServiceWorkFunction();
}
void WINAPI MyServiceCtrlHandler(DWORD)
{
SERVICE_STATUS MyServiceStatus = {0};
MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus);
}
void ServiceWorkFunction()
{
HWINSTA hWS;
HDESK hDT;
//Подключаемся к оконной станции
hWS = OpenWindowStation("Winsta0", FALSE, GENERIC_ALL);
SetProcessWindowStation(hWS);
//Подключаемсякрабочемустолу
hDT = OpenDesktop("Winlogon", 0, FALSE, GENERIC_ALL);
SetThreadDesktop(hDT);
//SetWindowsHookEx ит.д.
}
Вопросы присылайте на e-mail: http://bugtraq.ru/library/programming/ermolov_mark@mail.ru
P.S.
Всем желающим создавать подобные программы хочу порекомендовать несколько замечательных книг:
Список литературы
"Внутреннее устройство Windows 2000", Д. Соломон, М. Руссинович
"Программирование серверных приложений для Windows 2000", Дж. Рихтер, Дж. Кларк
"Windows для профессионалов", Дж. Рихтер
а также утилиты procexp.exe и winobj.exe от sysinternals.