Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Win32 Service

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.11.2004, 11:11 Uhr
(un)wissender
Niveauwart


Hallo, kennt jemand von euch ein paar Seiten, wo beschrieben wird (step by step) wie man einen Windows-Service scheibt? Am besten mit Code...
Ich habe bisher leider kaum was gefunden.

Danke!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.11.2004, 11:18 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Als ich das das erste mal machen musste hab ich mir bei Codeguru ein Programm runtergeladen und die wichtigen Stellen übernommen.

Schau mal ob du was findest:
www.codeguru.com/Cpp/W-P/system/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.11.2004, 11:54 Uhr
(un)wissender
Niveauwart


Danke, scheint ganz gut zu sein.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.11.2004, 14:00 Uhr
(un)wissender
Niveauwart


Kann mir einer genau erklären, was diese funktion tut: StartServiceCtrlDispatcher?
Ich werde aus der MSDN-Erklärung nicht ganz schlau.
Irgendein Prozess/Thread wird neu gestartet, aber was genau?
Ich hätte nicht gedacht, dass ein Service schreiben so verwirrend ist. Kommt mir sehr unorganisiert vor, was MS da gemacht hat.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 14.11.2004 um 14:01 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.11.2004, 14:20 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Es wird kein Thread neugestartet sondern der Hauptthread deines Services sollte diese Funktion aufrufen um sich beim Windows Service Control Manager zu registrieren.

Über den Control Manager kann man ja Threads starten beenden und so und der Manager muss ja wissen wohin er die ganzen Sachen schicken muss.

Also so habe ich das jetzt verstanden.

Dieser Post wurde am 14.11.2004 um 14:20 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.11.2004, 14:37 Uhr
(un)wissender
Niveauwart


Ich glaube, du bringst da zwei Funkionen durcheinander, RegisterServiceCtrlHandler registriert den CallBack für Statusveränderungen und muss vor StartServiceCtrlDispatcher aufgerufen werden.
StartServiceCtrlDispatcher gibt igendwie den "Startschuss" für den Dienst...


Zitat von MSDN:

The StartServiceCtrlDispatcher function connects the main thread of a service process to the service control manager, which causes the thread to be the service control dispatcher thread for the calling process.



Kapiert habe ich das nicht, welche Prozess ist der calling process?

Auch wenn MSDN sagt, StartServiceCtrlDispatcher wäre blockierend, so stimmt das nicht, zumindest nicht für den Aufrufer. Irgenwas wird da umgemodelt oder gestartet. Wenn ich eine exe habe und diese Funktion aufrufen, dann beendet sich die exe, aber der Dienst läuft.

Wie ist denn das allgemein, was muss man tun, damit ein Dienst nach dem Reboot noch da ist?
Was passiert, wenn er beendet wird?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.11.2004, 15:02 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wenn ich am Montag Zeit haben dann stell ich dir mal ein kleines Programm zusammen das sich selbst als Dienst installieren kann und dann läuft.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.11.2004, 09:26 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


So ungefährsollte das funktionieren:

C++:
struct GLOBALS
{
    bool        bRunning;
    SERVICE_STATUS            m_ServiceStatus;
    SERVICE_STATUS_HANDLE    m_ServiceStatusHandle;
}g_;

APIENTRY WinMain(HINSTANCE hInstance,        
                 HINSTANCE hPrevInstance,
                 LPSTR lpCmdLine,
                 int nCmdShow)
{

    if(strcmp(lpCmdLine,"") !=0)
    {
        if(strcmp(lpCmdLine,"-i")==0)
        {
            if(InstallService())
                MessageBox(0,"Service erfolgreich installiert.","test",MB_APPLMODAL);
            else
                MessageBox(0,"Service konnte nicht installiert werden!","test",MB_APPLMODAL);
        }
        else if(strcmp(lpCmdLine,"-d")==0)
        {
            if(DeleteService())
                MessageBox(0,"Service erfolgreich deinstalliert.","test",MB_APPLMODAL);
            else
                MessageBox(0,"Service konnte nicht deinstalliert werden!","test",MB_APPLMODAL);
        }
        else
        {
            MessageBox(0,"Unbekannter Parameter\n\nZum installieren: -i\n\nZum Deinstallieren: -d","test",MB_APPLMODAL);
        }
    }
    else
    {
        SERVICE_TABLE_ENTRY DispatchTable[]={{"Testservice",ServiceMain},{NULL,NULL}};  
        StartServiceCtrlDispatcher(DispatchTable);
    }
    return 0;    //Programm Ende
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
    g_.m_ServiceStatus.dwServiceType        = SERVICE_WIN32;
    g_.m_ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    g_.m_ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
    g_.m_ServiceStatus.dwWin32ExitCode      = 0;
    g_.m_ServiceStatus.dwServiceSpecificExitCode = 0;
    g_.m_ServiceStatus.dwCheckPoint         = 0;
    g_.m_ServiceStatus.dwWaitHint           = 0;

    g_.m_ServiceStatusHandle = RegisterServiceCtrlHandler("Testserver",ServiceCtrlHandler);  
    if (g_.m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        return;
    }    

    g_.m_ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    g_.m_ServiceStatus.dwCheckPoint         = 0;
    g_.m_ServiceStatus.dwWaitHint           = 0;  
    if (!SetServiceStatus (g_.m_ServiceStatusHandle, &g_.m_ServiceStatus))
    {

    }
    
    g_.bRunning=true;
    while(g_.bRunning)
    {            
        //Hier kommt dann das Hauptprogramm hin
    }

    return;
}

//-----------------------------------------------
//    Kontrollhandels des Dienstes
//-----------------------------------------------
void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
    switch(Opcode)
    {
        case SERVICE_CONTROL_PAUSE:
            g_.m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
            break;

        case SERVICE_CONTROL_CONTINUE:
            g_.m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
            break;

        case SERVICE_CONTROL_STOP:
            g_.m_ServiceStatus.dwWin32ExitCode = 0;
            g_.m_ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
            g_.m_ServiceStatus.dwCheckPoint    = 0;
            g_.m_ServiceStatus.dwWaitHint      = 0;

            SetServiceStatus (g_.m_ServiceStatusHandle,&g_.m_ServiceStatus);

            g_.bRunning=false;

            break;

        case SERVICE_CONTROL_INTERROGATE:
            break;
    }      
    return;
}

BOOL InstallService()
{

    char strDir[1024];
    SC_HANDLE schSCManager,schService;

    GetCurrentDirectory(1024,strDir);
    strcat(strDir,"\\test.exe");

    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  

    if (schSCManager == NULL)
        return false;

    LPCTSTR lpszBinaryPathName=strDir;

    schService = CreateService(schSCManager,"Test","Test2",           // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_AUTO_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        lpszBinaryPathName,        // service's binary
        NULL,                      // no load ordering group
        NULL,                      // no tag identifier
        NULL,                      // no dependencies
        NULL,                      // LocalSystem account
        NULL);                     // no password

    if (schService == NULL)
        return false;  

    StartService(schService,0,0);

    CloseServiceHandle(schService);

    return true;
}

BOOL DeleteService()
{
    SC_HANDLE    schSCManager,
                hService;

    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    if (schSCManager == NULL)
        return false;    

    hService=OpenService(schSCManager,"Testservice",SERVICE_ALL_ACCESS);

    if (hService == NULL)
        return false;

    if(DeleteService(hService)==0)
        return false;

    if(CloseServiceHandle(hService)==0)
        return false;
    else
        return true;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.11.2004, 10:18 Uhr
(un)wissender
Niveauwart


Danke!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: