Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53

Приложение Служба

15.11.2013, 16:55. Показов 1663. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем-то никогда до этого не писал службы.

Есть приложение вот скелет так скажем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hMainWnd;  
    char szClassName[] = "MyClass";
    MSG msg;
    WNDCLASSEX wc;
    
    // Заполняем структуру класса окна
    wc.cbSize        = sizeof(wc);      
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
 
    // Регистрируем класс окна
    if (!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }
    
    // Создаем основное окно приложения
    hMainWnd = CreateWindow( 
        szClassName, "A Hello1 Application", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        (HWND)NULL, (HMENU)NULL,
        (HINSTANCE)hInstance, NULL
    );
    
    if (!hMainWnd) {
        MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
        return 0;
    }
 
    // Показываем наше окно
    ShowWindow(hMainWnd, nCmdShow); 
//  UpdateWindow(hMainWnd);
 
    // Выполняем цикл обработки сообщений до закрытия приложения
    while (GetMessage(&msg, NULL, 0, 0))  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
 
    switch (msg)
    {
    case WM_CREATE:
 
              return 0;
 
/* ------------ */
 
    case WM_CLOSE:
        DestroyWindow(hWnd);
        return 0;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
 
    return 0;
}
С этим ладно. Компилирую приложение и потом пытаюсь установить службу
Bash
1
sc screate Service1 binpath= "путь до exe"
Все нормально устанавливается, но когда пытаюсь запустить службу долго ждет и потом выдает ошибку1053 "Служба не ответила на запрос своевременно"
Пробовал отсюда http://habrahabr.ru/post/71533/ но как я понял здесь описывается как установить службу программно, с установкой потом для начала хочу понять как создать приложение которое могло бы быть службой (обязательно WinMain с окном)

Добавлено через 55 минут
Если можно то примерчик простой скинте кто-нибудь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2013, 16:55
Ответы с готовыми решениями:

Служба времени
задача остановить службу времени от пользователя с обычными правами. просто остановки от админа - я добился, почитав хэлп к студии и рдсн....

Служба и Windows 8
Потребовалось перенести службу на Windows 8 на планшете и столкнулся со странной проблемой. Если службу регистрировать в системе при...

Интерактивный сервис (служба)
std::cout << "Привет всем!"; Хочу сделать так, чтобы сервис мог создавать окна GUI. Просто простановка флага...

8
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.11.2013, 19:31
потому что SCM ожидает ответа от службы о ее состоянии (статусе). А для этого кода обычного оконного приложения не достаточно.
подробности тут: http://msdn.microsoft.com/en-u... s.85).aspx

примерчик простой тут:
http://www.codeproject.com/Art... -Cplusplus
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
15.11.2013, 20:51  [ТС]
А получается мою WINAPI WinMain запускать из ServiceWorkerTheard ? как отдельный поток CreateThread() и ставить на него WaitForSingleObject (INFINITY milisec) ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.11.2013, 20:58
Цитата Сообщение от mdvalex Посмотреть сообщение
для начала хочу понять как создать приложение которое могло бы быть службой (обязательно WinMain с окном)
Так не выйдет. Либо служба, либо окно.
Службы запускаются до входа пользователя в систему и работают в фоне, в
специально выделенном для них неинтерактивном окружении, где никаких
окон быть не должно.
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
15.11.2013, 21:02  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Так не выйдет. Либо служба, либо окно.
Службы запускаются до входа пользователя в систему и работают в фоне, в
специально выделенном для них неинтерактивном окружении, где никаких
окон быть не должно.
Вот черт как же тогда быть... Не в ручную же в каждый комп в автозагрузку пихать приложение...

Добавлено через 1 минуту
И получается службой нельзя ловить события WM_CREATE WM_DEVICECHANGE ... ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.11.2013, 21:06
Цитата Сообщение от mdvalex Посмотреть сообщение
И получается службой нельзя ловить события WM_CREATE WM_DEVICECHANGE ... ?
Можно. Только в RegisterDeviceNotification, вызванной из службы, нужно передавать
не хэндл окна, а хэндл, полученный на RegisterServiceCtrlHandler. И в обработчик
событий службы будет приходить сигнал SERVICE_CONTROL_DEVICEEVENT, эквивалентный
WM_DEVICECHANGE. А вот никаких оконных процедур в службе лучше не делать.
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
15.11.2013, 21:12  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно. Только в RegisterDeviceNotification, вызванной из службы, нужно передавать
не хэндл окна, а хэндл, полученный на RegisterServiceCtrlHandler. И в обработчик
событий службы будет приходить сигнал SERVICE_CONTROL_DEVICEEVENT, эквивалентный
WM_DEVICECHANGE. А вот никаких оконных процедур в службе лучше не делать.
охохо это пол программы переписывать.
И также будут события DBT_DEVTYP_VOLUME ?

и что за обработчик событий службы? это чтото вроде CALLBACK WinProc ? Там же должен быть lParam wParam...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.11.2013, 21:18
Цитата Сообщение от mdvalex Посмотреть сообщение
И также будут события DBT_DEVTYP_VOLUME ?
Не только эти события, но и многие другие.

Цитата Сообщение от mdvalex Посмотреть сообщение
и что за обработчик событий службы? это чтото вроде CALLBACK WinProc ? Там же должен быть lParam wParam...
Посмотрите здесь:

HandlerEx
http://msdn.microsoft.com/en-u... s.85).aspx
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
16.11.2013, 10:51  [ТС]
Вобщем не получается отловить событие DBT_DEVTYP_VOLUME


В ServiceMain() подписываюсь вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
 
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
 
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
 
for (int i = 0; i < sizeof(GuidDevInterfaceList); i++)
 
{
 
NotificationFilter.dbcc_classguid = GuidDevInterfaceList[i];
 
hDeviceNotify = RegisterDeviceNotification(/*m_hWnd*/m_hServiceStatus, &NotificationFilter,
 
DEVICE_NOTIFY_SERVICE_HANDLE/*DEVICE_NOTIFY_WINDOW_HANDLE*/);
В GUID листе у меня USB_GUID и DISK_GUID


Сообщение DBT_DEVTYPE_DEVINTERFACE приходит нормально (только правда почему-то не могу извлечь символьную ссылку как делал это в Windows-форм приложении)

А вот VOLUME событие не приходит пробовал
DEV_BROADCAST_VOLUME NotificationFilter;
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_VOLUME);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_VOLUME;

но тоже нифига не приходит

PS не в тему но можно ли как-нибудь отправить уже исполняемой программе команду в виде WM_ события и в дальнейшем ее обработав в коде. Команда в данном случае - любая строка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2013, 10:51
Помогаю со студенческими работами здесь

Не удаляется служба Windows
Добрый день. У меня трабла с удалением службы Windows через WinApi. Ситуация такая: Есть определённая служба, которой я пытаюсь...

32 битная служба в 64 битной системе
Доброго времени суток. Возможно ли и всегда ли можно установить (запустить) 32 разрядную службу на 64 разрядной машине ? Или есть свои...

Запустить приложение, и получить результат, который вернуло отработавшее приложение
Всем привет! Народ подскажите апишку(ки) для реализации следующей задачи. Мне нужно проверить соответствие введенного пользователем...

Что такое служба ? Windows Service
Рассматриваю вариант решение поставленной задачи написанием своей службы. Собственно, доки уверенно настаивают на написание службы в...

Определение вида процесса (служба или обычный процесс)
Привет, помогите пож. определить вид процесса. Гуглил, но ответа так и не нашел Добавлено через 6 минут не нужен код, просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru