Dienst tut nicht wie ich will
-
Hallo!
Hab ein Programm geschrieben, dass mittlerweile auch als Windows - Dienst abläuft. Nur funktioniert folgendes nicht:
Hab einen CreateService - Aufruf mit der Übergabe SERVICE_AUTO_START.
Unter der Verwaltung ist der Dienst nach dem Starten zu sehen, nur macht er seine Aufgabe nicht.
Das ganze funktioniert aber, wenn ich händisch den Dienst noch einmal neu starte. Woran kann das liegen??
(Das Programm das ich ausführe, ist ein Programm, dass Daten übers Netzwerk hin und her transferiert. - vielleicht liegt es daran, dass das Netzwerk noch nicht vollständig aufgebaut ist??)
-
Startart: Autostart besagt, das der Dienst beim hochfahren des Rechners gestertet wird (auch ohne Nutzeranmeldung!).
Es besagt nicht, das Dein Dienst automatisch startet, sobald er erstellt wurde!
-
hallo,
Kannst du bitte mal Code posten, weil ich es einfach nich schaffe meinen Dienst zu starten.
Wie muss ein Programm genau ausehem, um als Dienst laufen zu können.?
-
Na er sollte ja beim Hochfahren starten. (Macht er ja auch laut Verwaltung-Dienste).
Mir is schon klar, dass mein Dienst nichts macht, direkt nach dem Erstellen.Es geht darum, dass wenn ich Windows starte, soll sich mein Programm zu einem Server verbinden. Das macht er aber nicht, obwohl der Dienst gestartet wurde.
Wenn ich dann in die Verwaltung-Dienste hineingehe und meinem Dienst neu starte, dann funktionierts.
-
-
Danke,
aber diesen Link habe ich schon gefunden, mein problem ist dass ich nicht
verstehe, was alles dazu gehört und wo ich anfangen soll.
Daher: was muss in nem Programm stehen, damit es als Dienst läuft?
Bitte etwas code und nicht immer diesen Link.
Danke
-
oder anders gefragt:
Wie kann ich einen Dienst schreiben, der Abhängig ist von irgendeiner Netzwerkomponente (bzw. -dienst)??
bzw. wollte ich es jetzt mit dem SERVICE_INTERACTIVE_PROCESS - Flag probieren, aber da kann er mir dann keinen Dienst mehr erstellen!?
Jemand Lösungsvorschläge??
-
@MisterX
Ich hab mir das selber aus der MSDN zamkopiert!
Also bringt dir mein Code nichts, da er ja sowieso in der MSDN gleich drin steht!
-> [url] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/service_programs.asp [/url]
Unter diesem Link findest du genug Code - Beispiele die dir weiterhelfen.
Solltest du durch die nicht weiter kommen, dann frag wieder nach!
-
Also, ich hab mir jetzt dies zusammenkopiert:
#include <windows.h>
#include <winsvc.h>
#include <stdio.h>VOID MyServiceStart (DWORD argc, LPTSTR *argv);
VOID MyServiceCtrlHandler (DWORD opcode);
DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv,
DWORD *specificError);SERVICE_STATUS MyServiceStatus;
SERVICE_STATUS_HANDLE MyServiceStatusHandle;DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv,
DWORD *specificError)
{
argv;
argc;
specificError;
return(0);
}VOID SvcDebugOut(LPSTR String, DWORD Status)
{
CHAR Buffer[1024];
if (strlen(String) < 1000)
{
sprintf(Buffer, String, Status);
OutputDebugStringA(Buffer);
}
}VOID MyServiceCtrlHandler (DWORD Opcode)
{
DWORD status;switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
// Do whatever it takes to pause here.
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;case SERVICE_CONTROL_CONTINUE:
// Do whatever it takes to continue here.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;case SERVICE_CONTROL_STOP:
// Do whatever it takes to stop here.
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;if (!SetServiceStatus (MyServiceStatusHandle,
&MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
return;case SERVICE_CONTROL_INTERROGATE:
// Fall through to send current status.
break;default:
SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",
Opcode);
}// Send current status.
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status);
}
return;
}void MyServiceStart (DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_PAUSE_CONTINUE;
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwServiceSpecificExitCode = 0;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;MyServiceStatusHandle = RegisterServiceCtrlHandler(
"MyService",
MyServiceCtrlHandler); //////////////////////Erster fehler hierif (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError());
return;
}// Initialization code goes here.
status = MyServiceInitialization(argc,argv, &specificError);// Handle error condition
if (status != NO_ERROR)
{
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatus.dwWin32ExitCode = status;
MyServiceStatus.dwServiceSpecificExitCode = specificError;SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
return;
}// Initialization complete - report running status.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}// This is where the service does its work.
SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0);return;
}// Stub initialization function.
void Servicemain( )
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ "MyService", MyServiceStart },
{ NULL, NULL } /////Zweiter fehler hier
};if (!StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError());
}
}Als fehlermeldung erhalte ich:
error C2664: 'RegisterServiceCtrlHandlerA' : Konvertierung des Parameters 2 von 'void (unsigned long)' in 'void (__stdcall *)(unsigned long)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp uebereinerror C2440: 'initializing' : '' kann nicht in 'void (__stdcall *)(unsigned long,char ** )' konvertiert werden
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp uebereinWas muss ich ändern?
-
Mensch Mädels, benutzt doch mal Code-Tags!!!
Was muss ich ändern?
Schreib
[code type="C++" tabs="4"][ /code]
um deinen Code herum! Herrgottnichnochmal...
[ Dieser Beitrag wurde am 20.03.2003 um 19:40 Uhr von Hepi editiert. ]
-
Also, ich hab mir jetzt dies zusammenkopiert:
[code type="C++" tabs="4"][ /code]#include <windows.h>
#include <winsvc.h>
#include <stdio.h>VOID MyServiceStart (DWORD argc, LPTSTR *argv);
VOID MyServiceCtrlHandler (DWORD opcode);
DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv,
DWORD *specificError);SERVICE_STATUS MyServiceStatus;
SERVICE_STATUS_HANDLE MyServiceStatusHandle;DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv,
DWORD *specificError)
{
argv;
argc;
specificError;
return(0);
}VOID SvcDebugOut(LPSTR String, DWORD Status)
{
CHAR Buffer[1024];
if (strlen(String) < 1000)
{
sprintf(Buffer, String, Status);
OutputDebugStringA(Buffer);
}
}VOID MyServiceCtrlHandler (DWORD Opcode)
{
DWORD status;switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
// Do whatever it takes to pause here.
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;case SERVICE_CONTROL_CONTINUE:
// Do whatever it takes to continue here.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;case SERVICE_CONTROL_STOP:
// Do whatever it takes to stop here.
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;if (!SetServiceStatus (MyServiceStatusHandle,
&MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
return;case SERVICE_CONTROL_INTERROGATE:
// Fall through to send current status.
break;default:
SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",
Opcode);
}// Send current status.
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status);
}
return;
}void MyServiceStart (DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_PAUSE_CONTINUE;
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwServiceSpecificExitCode = 0;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;MyServiceStatusHandle = RegisterServiceCtrlHandler(
"MyService",
MyServiceCtrlHandler); //////////////////////Erster fehler hierif (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError());
return;
}// Initialization code goes here.
status = MyServiceInitialization(argc,argv, &specificError);// Handle error condition
if (status != NO_ERROR)
{
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatus.dwWin32ExitCode = status;
MyServiceStatus.dwServiceSpecificExitCode = specificError;SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
return;
}// Initialization complete - report running status.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}// This is where the service does its work.
SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0);return;
}// Stub initialization function.
void Servicemain( )
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ "MyService", MyServiceStart },
{ NULL, NULL } /////Zweiter fehler hier
};if (!StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError());
}
}
[code type="C++" tabs="4"][ /code]Als fehlermeldung erhalte ich:
error C2664: 'RegisterServiceCtrlHandlerA' : Konvertierung des Parameters 2 von 'void (unsigned long)' in 'void (__stdcall *)(unsigned long)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp uebereinerror C2440: 'initializing' : '' kann nicht in 'void (__stdcall *)(unsigned long,char ** )' konvertiert werden
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp uebereinWas muss ich ändern?
-
Himmel hilf.....
Ich geb's auf....
[code type="C++" tabs="4"]HIER KOMMT DEIN CODE HIN!
[/cpp]
[ Dieser Beitrag wurde am 20.03.2003 um 19:56 Uhr von Hepi editiert. ]
-
@Hepi
Du musst auch verstehen, dass manch Programmierer (oder auch "Möchtegern - Programmierer") noch nie in seinem Leben einen HTML - Code gesehen hat. **:-)**Deswegen gib nicht auf ...
-
...aber lesen wird er doch können, oder? Und den blauen C++ CODE Button sieht man doch da unten, oder???
#include <windows.h> #include <winsvc.h> #include <stdio.h> VOID MyServiceStart (DWORD argc, LPTSTR *argv); VOID MyServiceCtrlHandler (DWORD opcode); DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); SERVICE_STATUS MyServiceStatus; SERVICE_STATUS_HANDLE MyServiceStatusHandle; DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) { argv; argc; specificError; return(0); } VOID SvcDebugOut(LPSTR String, DWORD Status) { CHAR Buffer[1024]; if (strlen(String) < 1000) { sprintf(Buffer, String, Status); OutputDebugStringA(Buffer); } } VOID MyServiceCtrlHandler (DWORD Opcode) { DWORD status; switch(Opcode) { case SERVICE_CONTROL_PAUSE: // Do whatever it takes to pause here. MyServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: // Do whatever it takes to continue here. MyServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: // Do whatever it takes to stop here. MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); } SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0); return; case SERVICE_CONTROL_INTERROGATE: // Fall through to send current status. break; default: SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n", Opcode); } // Send current status. if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status); } return; } void MyServiceStart (DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; MyServiceStatus.dwServiceType = SERVICE_WIN32; MyServiceStatus.dwCurrentState = SERVICE_START_PENDING; MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwServiceSpecificExitCode = 0; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatusHandle = RegisterServiceCtrlHandler( "MyService", MyServiceCtrlHandler); //////////////////////Erster fehler hier if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); return; } // Initialization code goes here. status = MyServiceInitialization(argc,argv, &specificError); // Handle error condition if (status != NO_ERROR) { MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatus.dwWin32ExitCode = status; MyServiceStatus.dwServiceSpecificExitCode = specificError; SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus); return; } // Initialization complete - report running status. MyServiceStatus.dwCurrentState = SERVICE_RUNNING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); } // This is where the service does its work. SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0); return; } // Stub initialization function. void Servicemain( ) { SERVICE_TABLE_ENTRY DispatchTable[] = { { "MyService", MyServiceStart }, { NULL, NULL } /////Zweiter fehler hier }; if (!StartServiceCtrlDispatcher( DispatchTable)) { SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); } }
UFF! Mann, Du schuldest mir was......