На главную

• Гостевая книга • Bios • Реестр • Память • Вирт.память • Оптимизация • Fat32 • Hot-клавиши • Ссылки • MsDos • Downloads • Сстема • На главную • 

Пример 1

// Функция, аналог MessageBox Win32 API
int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText,
LPSTR lpszTitle, UINT fuStyle)
{
DWORD dwThreadId;
HWINSTA hwinstaSave;
HDESK hdeskSave;
HWINSTA hwinstaUser;
HDESK hdeskUser;
  int result;

// Запоминаем текущие объекты “Window station” и “Desktop”.
GetDesktopWindow();
hwinstaSave = GetProcessWindowStation();
dwThreadId = GetCurrentThreadId();
hdeskSave = GetThreadDesktop(dwThreadId);

// Меняем контекст безопасности на тот,
// который есть у вызавшего клиента RPC
// и получаем доступ к пользовательским
// объектам “Window station” и “Desktop”.
RpcImpersonateClient(h);
hwinstaUser = OpenWindowStation(“WinSta0”,
FALSE, MAXIMUM_ALLOWED);
if (hwinstaUser == NULL)
{
RpcRevertToSelf();
return 0;
}
SetProcessWindowStation(hwinstaUser);
hdeskUser = OpenDesktop(“Default”, 0, FALSE, MAXIMUM_ALLOWED);
RpcRevertToSelf();
if (hdeskUser == NULL)
{
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
return 0;
}
SetThreadDesktop(hdeskUser);

// Выводим обычное текстовое окно.
result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);

// Восстанавливаем сохраненные объекты
// “Window station” и “Desktop”.
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hwinstaUser);

return result;
}

Пример 2

void main()
{
SERVICE_TABLE_ENTRY steTable[] =
{
{SERVICENAME, ServiceMain},
{NULL, NULL}
};

// Устанавливаем соединение с SCM. Внутри этой функции
// происходит прием и диспетчеризация запросов.
StartServiceCtrlDispatcher(steTable);
}

Пример 3

void WINAPI ServiceMain(DWORD dwArgc, LPSTR *psArgv)
{
// Сразу регистрируем обработчик запросов.
hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler);

sStatus.dwCheckPoint = 0;
sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_PAUSE_CONTINUE;
sStatus.dwServiceSpecificExitCode = 0;
sStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
sStatus.dwWaitHint = 0;
sStatus.dwWin32ExitCode = NOERROR;

// Для инициализации службы вызывается функция InitService();
// Для того, чтобы в процессе инициализации система не
// выгрузила службу, запускается поток, который раз в
// секунду сообщает, что служба в процессе инициализации.
// Для синхронизации потока создаётся событие.
// После этого запускается рабочий поток, для
// синхронизации которого также
// создаётся событие.

hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL);

HANDLE hSendStartThread;
DWORD dwThreadId;

hSendStartThread = CreateThread(NULL, 0, SendStartPending,
NULL, 0, &dwThreadId);

//Здесь производится вся инициализация службы.
InitService();

SetEvent(hSendStartPending);

if(
WaitForSingleObject(hSendStartThread, 2000)
!= WAIT_OBJECT_0)
{
TerminateThread(hSendStartThread, 0);
}

CloseHandle(hSendStartPending);
CloseHandle(hSendStartThread);
hWork = CreateEvent(NULL, TRUE, FALSE, NULL);

hServiceThread = CreateThread(NULL, 0, ServiceFunc,
0, 0, &dwThreadId);

sStatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus(hSS, &sStatus);
}

// Функция потока, каждую секунду посылающая уведомления SCM
// о том, что процесс инициализации идёт. Работа функции
// завершается, когда устанавливается
// событие hSendStartPending.

DWORD WINAPI SendStartPending(LPVOID)
{
sStatus.dwCheckPoint = 0;
sStatus.dwCurrentState = SERVICE_START_PENDING;
sStatus.dwWaitHint = 2000;

// “Засыпаем” на 1 секунду. Если через 1 секунду
// событие hSendStartPending не перешло
// в сигнальное состояние (инициализация службы не
// закончилась), посылаем очередное уведомление,
// установив максимальный интервал времени
// в 2 секунды, для того, чтобы был запас времени до
// следующего уведомления.
while (true)
{
SetServiceStatus(hSS, &sStatus);
sStatus.dwCheckPoint++;
if(WaitForSingleObject(hSendStartPending,
1000)!=WAIT_TIMEOUT)
break;
}

sStatus.dwCheckPoint = 0;
return 0;
}

// Функция, инициализирующая службу. Чтение данных,
// распределение памяти и т.п.
void InitService()
{
...
}

// Функция, содержащая «полезный» код службы.
DWORD WINAPI ServiceFunc(LPVOID)
{
while (true)
{
if (!bPause)
{
// Здесь содержится код, который как правило
// выполняет какие-либо циклические операции...
}

if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT)
break;
}

return 0;
}

Пример 4

// Обработчик запросов от SCM
void WINAPI ServiceHandler(DWORD dwCode)
{
switch (dwCode)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
ReportStatusToSCMgr(SERVICE_STOP_PENDING,
NO_ERROR, 0, 1000);
hSendStopPending = CreateEvent(NULL, TRUE, FALSE, NULL);
hSendStopThread = CreateThread(NULL, 0,
SendStopPending, NULL, 0, & dwThreadId);
SetEvent(hWork);
if (WaitForSingleObject(hServiceThread,
1000) != WAIT_OBJECT_0)
{
TerminateThread(hServiceThread, 0);
}
SetEvent(hSendStopPending);
CloseHandle(hServiceThread);
CloseHandle(hWork);
if(WaitForSingleObject(hSendStopThread,
2000) != WAIT_OBJECT_0)
{
TerminateThread(hSendStopThread, 0);
}
CloseHandle(hSendStopPending);
sStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hSS, &sStatus);
break;
case SERVICE_CONTROL_PAUSE:
bPause = true;
sStatus.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus(hSS, &sStatus);
break;
case SERVICE_CONTROL_CONTINUE:
bPause = true;
sStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hSS, &sStatus);
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus(hSS, &sStatus);
break;
default:
SetServiceStatus(hSS, &sStatus);
break;
}
}


// Функция потока, аналогичная SendStartPending
// для останова службы.
DWORD WINAPI SendStopPending(LPVOID)
{
sStatus.dwCheckPoint = 0;
sStatus.dwCurrentState = SERVICE_STOP_PENDING;
sStatus.dwWaitHint = 2000;

while (true)
{
SetServiceStatus(hSS, &sStatus);
sStatus.dwCheckPoint++;
if(WaitForSingleObject(hSendStopPending,
1000)!=WAIT_TIMEOUT)
break;
}

sStatus.dwCheckPoint = 0;
return 0;
}

[Вернуться назад]




Windows-вопросы и ответы
Hosted by uCoz