Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сервис [D7, XP]


Страницы:   1 2 3 4

Levin_610 ©   (2006-07-14 12:50:00) 

как зарегестрировать программу, как сервис?


Levin_610   (2006-07-17 12:52:00) [41]

я прочиталЮ и вроде бы всё нормально в моей программе - надо было идти в футболисты)


isasa   (2006-07-17 12:33:00) [42]

Судя по вопросам, все-таки, сходи по ссылке
Leonid Troyanovsky ©   (14.07.06 22:41) [8]
на rsdn.
Наступит просветление. :)


isasa   (2006-07-17 12:31:00) [43]

:)
Если по-простому, то

while exitFlag=0 do begin
 <делаем что-то>
 Sleep(<скоко надо, если надо>);
end;

Или, если хочешь с ним общаться через WM_<message>, то GetMessage в цикле.


Levin_610   (2006-07-17 12:23:00) [44]

пожалуйста


Levin_610   (2006-07-17 12:05:00) [45]

ссылку на какой-нибудь нормальный готовый класс можешь дать?


Fay   (2006-07-17 12:00:00) [46]

2 Levin_610 ©   (17.07.06 11:34) [22]
>  что нужнопрописать в основной ф-ции
Предполагается, что ты это уже знаешь.
Не парь мозги, возьми готовый класс службы.


Levin_610   (2006-07-17 11:34:00) [47]

а что нужнопрописать в основной ф-ции function MainServiceThread(p: Pointer): DWORD; stdcall;
 var hWinSta, hDesktop, hOldWinSta, hOldDesktop: THandle;
begin
 sleep(10);
end;
ещё что-то?


Levin_610   (2006-07-17 11:27:00) [48]

всё есть - CreateServise


Levin_610   (2006-07-17 11:23:00) [49]

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


Fay   (2006-07-17 11:08:00) [50]

2 Levin_610 ©   (17.07.06 10:47) 17]
> STANDARD_RIGHTS_REQUIRED
SC_MANAGER_CREATE_SERVICE не лучше? И ваще, где анализ результата выполнения CreateService?


isasa   (2006-07-17 10:54:00) [51]

Вот фрагмент болванки _tmain сервиса. На D, к сожалению нет, т.к. не юзаю.
Но идея, думаю, будет понятна. API функции -- те-же. Лежать должен в *.dpr, если не ошибаюсь.

TCHAR srvName[] = _T("DiSpy");
TCHAR srvDispName[] = _T("DiSpy Internet Broadband Router Spyer");
threadDataStruct thData;

int _tmain(int argc, _TCHAR* argv[])
{
...
  //Service Installing
    if(wcscmp(argv[1],L"/i")==0)
    {
       wprintf(L"Service installing ...\n");
       SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  // Open SC Manager
       if (NULL == schSCManager)
       {
        LPVOID lpMsgBuf;
        DWORD dw = GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
        wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
        LocalFree(lpMsgBuf);
        return 0;
       }
       SC_HANDLE schService = CreateService(schSCManager, srvName, srvDispName, SERVICE_ALL_ACCESS,    
                SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, thData.szPath,
                NULL, NULL, NULL, NULL, NULL);
       if (schService == NULL)
       {
           LPVOID lpMsgBuf;
           DWORD dw = GetLastError();
           FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                 NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"CreateService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         LocalFree(lpMsgBuf);
         return 0;
       }
       CloseServiceHandle(schService);
       wprintf(L"Service installing succeeded:\n");
       wprintf(L"Service display name: \"%s\"\n", srvDispName);
       wprintf(L"Service file path: \"%s\"\n", thData.szPath);
   return 0;
    }
    //Service Uninstalling
    if(wcscmp(argv[1],L"/u")==0)
    {
       wprintf(L"Service uninstalling ...\n");
       SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); // Open SC Manager
       if (NULL == schSCManager)
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                          NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
         LocalFree(lpMsgBuf);
         return 0;
       }
       SC_HANDLE schService = OpenService( schSCManager, srvName, DELETE);
       if (schService == NULL)
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
            NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"OpenService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         LocalFree(lpMsgBuf);
         return 0;
       }

       if (!DeleteService(schService))
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
     NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"DeleteService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         CloseServiceHandle(schService);
         LocalFree(lpMsgBuf);
         return 0;
       }

       wprintf(L"DeleteService succeeded.\n");
       wprintf(L"Service was deleted without error.\n");

       CloseServiceHandle(schSCManager);
       CloseServiceHandle(schService);
       return 0;
     }
...


Levin_610   (2006-07-17 10:47:00) [52]

последнее высказывание было необходимо) - я делаю так:
hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
 if (hSCMgr <> 0) then
 begin
   hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
     STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
     SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
     PChar(ExecutablePath), nil, nil, nil, nil, nil);
- это все, что нужно, чтобы SCM зарегистрировал службу? или нужно ещё что-то? Или может в этом коде есть ошибка?


Fay   (2006-07-17 10:38:00) [53]

2 Levin_610 ©   (17.07.06 10:27) [15]
Значит не дошёл


Levin_610   (2006-07-17 10:27:00) [54]

до этого я уже дошёл, я вроде прошу, но видимо как-то не так)


Ketmar   (2006-07-17 10:25:00) [55]

попросить SCM зарегистрировать. %-)


Levin_610   (2006-07-17 09:29:00) [56]

у меня почему-то не заходило, под моим ником, а просто_Мария полезный ник), я написал программу, как сервис, но как прописать, чтобы она регистрировалась?


Leonid Troyanovsky   (2006-07-14 23:25:00) [57]


> Leonid Troyanovsky ©   (14.07.06 23:21) [11]

> Я могу предложить версии, если ты поделишься
> основаниями для идентефикации.


Так основания шиты белыми нитками,
то, делится версиями я не буду, sorry.

--
Regards, LVT.


Leonid Troyanovsky   (2006-07-14 23:21:00) [58]


> isasa ©   (14.07.06 23:19) [10]

> Да еще такие разные?


Я могу предложить версии, если ты поделишься
основаниями для идентефикации.

--
Regards, LVT.


isasa   (2006-07-14 23:19:00) [59]

OFFTOP
Чистое любопытство. Зачем два ника?
Levin_610 ©
prosto_Maria ©

Да еще такие разные?


isasa   (2006-07-14 23:13:00) [60]

prosto_Maria ©   (14.07.06 16:09) [4]

там есть функция ServiceInitialization, что она делает и как её описать?


Очередной переписчик этой "библии" забыл ее закоментировать. Эта функция может быть написана(а может и нет) пользователем для инициализации каких-нибудь данных сервиса. Показывает место, где это уместно делать. В коментарий ее.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо