Problem mit Windows-Dienst
-
Der Dienst "Beeper Service" ist als interaktiver Dienst gekennzeichnet. Das System wurde jedoch so konfiguriert, dass interaktive Dienste nicht möglich sind. Der Dienst wird möglicherweise nicht richtig funktionieren.
steht da.
-
Hi
Ich meinte auch skullyan !
Mit dem wollte ich nur sagen, dass ich das auch gerne wissen möchte bevor da behauptungen aufgestellt werden.lowbyte
-
Okay und nun?
-
Tut mir leid^^ War nicht so gemeint.
Versuch mal in der Install Funktion das hier:
SC_HANDLE service = CreateService(serviceControlManager, serviceName, serviceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, 0, 0, 0, 0, 0 );
-
Achso, und das solltest du auch noch mal versuchen(ServiceMain):
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
-
Hat leider nichts geändert. Ach und mein OS ist Windows7 x64.
-
Dann versuch mal bitte deine Aktivitäten (Beep) usw. in einen seperaten Thread zu verschieben(was sowieso immer gemacht werden sollte).
-
Hat auch nicht funktioniert...
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] ) { // initialise service status serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwControlsAccepted = 0; serviceStatus.dwWin32ExitCode = NO_ERROR; serviceStatus.dwServiceSpecificExitCode = NO_ERROR; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; serviceStatusHandle = RegisterServiceCtrlHandler( serviceName, ServiceControlHandler ); if ( serviceStatusHandle ) { // service is starting serviceStatus.dwCurrentState = SERVICE_START_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do initialisation here stopServiceEvent = CreateEvent( 0, FALSE, FALSE, 0 ); // running serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0); do { Beep( 1000, 100 ); } while ( WaitForSingleObject( stopServiceEvent, 5000 ) == WAIT_TIMEOUT ); // service was stopped serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do cleanup here CloseHandle( stopServiceEvent ); stopServiceEvent = 0; // service is now stopped serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus( serviceStatusHandle, &serviceStatus ); } }Ich verzweilfe langsam..
-
Hi
CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0);Das sollte so aussehen :
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } CreateThread(0,0,BEEP,0,0,0);lowbyte
-
lowbyte_ schrieb:
Hi
CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0);Das sollte so aussehen :
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } CreateThread(0,0,BEEP,0,0,0);lowbyte
Normalerweise geht beides.
-
Hat es vlt. mit der Session 0 Isolation ab Vista zu tun?
-
Hmm..sehr komisch. Also dein Dienst läuft bei mir. Habe zwar auch Win7 aber nur 32Bit. Ich werde da aber nochmal nachhaken.. nteressiert mich nämlich auch;-)
-
secondsun schrieb:
Hmm..sehr komisch. Also dein Dienst läuft bei mir. Habe zwar auch Win7 aber nur 32Bit. Ich werde da aber nochmal nachhaken.. nteressiert mich nämlich auch;-)
Echt? Bei dir piept es?
-
Hi
Zuerst informiere Dich mal hier.
http://msdn.microsoft.com/en-us/library/ms687098(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms681928(v=VS.85).aspxint interaction(void) { HWINSTA m_hWinsta; HDESK m_hDesk; /* Interaction -------------------------------------------- */ m_hWinsta = OpenWindowStation("winsta0", FALSE, WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES ); if(m_hWinsta == NULL) { printf("error"); return 1; } SetProcessWindowStation(m_hWinsta); m_hDesk = OpenInputDesktop( DF_ALLOWOTHERACCOUNTHOOK, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS ); if(m_hDesk == NULL) { printf("error"); return 1; } SetThreadDesktop(m_hDesk); return 0; }lowbyte
-
Hab es nun mit nem anderen Code gelöst.
Quelle:
http://www.codeproject.com/KB/system/xyntservice.aspx
(Sehr empfehlenswert)
-
Versuch mal ein Log-File einzubauen und dieses dann mit DebugAusgaben zu füttern.
Sollte dein Code also ausgeführt werden wirst du es so erkennen(So eine Log-Datei ist wirklich eine lohnenswerte Zusatzklasse
).
Außerdem würde ich entweder einen Breakpoint setzen und Debuggen(Attach) oder für die faulen unter uns ein DebugBreak(); einfügen.
Sollte das System dort tatsächlich ankommen
- Ein Service hat von Natur aus einfach weniger Möglichkeiten (Schließlich startet derselbige ja auch schon mit dem System hoch) - deswegen mußt du dann ein wenig tricksen - dazu aber dann später mehr wenn du weißt ob das System dort ankommt.MfG
Sönke