Dienst proggn
-
Hallo an Alle! Hab unten stehendes Programm aus der MSDN zamkopiert und wollte das jetzt ausprobieren und schaun, ob das funktioniert.
Nur bekomm ich dann mit dem VC6 Compiler unter Windows 2000 folgende Fehlermeldung:
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/service.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Hab ich da auf irgendetwas vergessen? Bitte helft mir; danke!#include "stdafx.h" #include <windows.h> #include <winsvc.h> //advapi32.lib #include <stdio.h> #include <iostream.h> int main () { SC_HANDLE schSCManager, schService; SERVICE_STATUS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount; DWORD dwWaitTime; DWORD dwStatus; /* OPEN SC_MANAGER */ schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); if (schSCManager == NULL) printf("OpenSCManager"); LPCTSTR lpszBinaryPathName = "c:\\hello.exe"; /* Create Service */ schService = CreateService(schSCManager, "Sample_Srv", "HelloWorld", SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_DEMAND_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) printf("CreateService"); else printf("CreateService SUCCESS.\n"); CloseServiceHandle(schService); /* Open Service */ schService = OpenService(schSCManager, "Sample_Srv", SERVICE_ALL_ACCESS); if (schService == NULL) { printf("OpenService"); } /* Service Starten */ if (!StartService(schService, 0, NULL) ) { printf("StartService"); } else { printf("Service start pending.\n"); } // Check the status until the service is no longer start pending. if (!QueryServiceStatus( schService, // handle to service &ssStatus) ) // address of status information structure { printf("QueryServiceStatus"); } // Save the tick count and initial checkpoint. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { // Do not wait longer than the wait hint. A good interval is // one tenth the wait hint, but no less than 1 second and no // more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10; if( dwWaitTime < 1000 ) dwWaitTime = 1000; else if ( dwWaitTime > 10000 ) dwWaitTime = 10000; Sleep( dwWaitTime ); // Check the status again. if (!QueryServiceStatus( schService, // handle to service &ssStatus) ) // address of structure break; if ( ssStatus.dwCheckPoint > dwOldCheckPoint ) { // The service is making progress. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint) { // No progress made within the wait hint break; } } } if (ssStatus.dwCurrentState == SERVICE_RUNNING) { printf("StartService SUCCESS.\n"); dwStatus = NO_ERROR; } else { printf("\nService not started. \n"); printf(" Current State: %d\n", ssStatus.dwCurrentState); printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode); printf(" Service Specific Exit Code: %d\n", ssStatus.dwServiceSpecificExitCode); printf(" Check Point: %d\n", ssStatus.dwCheckPoint); printf(" Wait Hint: %d\n", ssStatus.dwWaitHint); dwStatus = GetLastError(); } CloseServiceHandle(schService); return dwStatus; }
-
Sieht so aus als ob Du falsche Projekteinstellung verwendet hast.
Eine "Win32-Anwendung" will eine WinMain() haben, eine "Konsolenanwendung" braucht eine main().
Schätze mal Du hast beim erstellen des Projektes "Win32-Anwendung" gewählt, was falsch ist!
Stell (in MS Visual C++) die Befehlszeile um auf "/SUBSYSTEM:Console"
Dann sollte es klappen...
[ Dieser Beitrag wurde am 19.03.2003 um 10:26 Uhr von Hepi editiert. ]
-
Du hast, als Du das Projekt angelegt hast, den Projekt-Typ 'Win32-Anwendung' gewählt. Jetzt gibt es zwei Möglichkeiten:
- Du packst Deinen Code von main nach WinMain um
- Du erstellst eine 'Win32-Konsolenanwendung'. Dazu mußt Du in den Projekt-Einstellungen auf dem Tab 'Linker' in den 'Projekt-Optionen' (Kategorie Allgemein, EditCtrl ganz unten) den Schalter /SUBSYSTEM: von WINDOWS auf CONSOLE ändernn.
[edit] So geht das, wenn man sich beim Tippen Zeit lässt ... [/edit]
[ Dieser Beitrag wurde am 19.03.2003 um 10:29 Uhr von -King- editiert. ]
-
Super! Danke für die schnelle Antwort.
Nur mein Dienst startet jetzt nicht. Was muss ich in meinem .exe - File einbauen, damit mein Dienst startet?
-
Hast Du denn überhaupt ein Programm namens "hello.exe" und liegt es im Root von Laufwerk C?
-
jaja!
einfach nur ein hello - World Programm.
-
komischer weiße sagt mir das programm, dass es den Dienst nicht erstellen kann (-> Create Service failed)!?
-
Tja, du brauchst aber einen Hallo Welt Service
-
wie schaut ein Hallo - Welt Service aus??
-
Zum Beispiel brauch es ein ServiceMain.
A ServiceMain function is the entry point for a service.
-
Also, dein Programm möchte C:\hello.exe in einen Dienst "HelloWorld" verwandeln und entsprechend managen.
*Grübel*
Gibt CreateService nicht auch mit GetLastError() weiterführende Infos aus?
Was passiert wenn DuLPCTSTR lpszBinaryPathName = "c:\\hello.exe";
änderst in
LPCTSTR lpszBinaryPathName = "c:\hello.exe";
?
/EDIT: Okay, das klappt so nicht. "c:\\hello.exe" ist richtig so!Deine Fehlerbehandlungsroutinen
if (schSCManager == NULL) printf("OpenSCManager");
versteh ich auch nicht so recht, weil das Programm trotz Fehler ungehindert weitermachen soll/darf.
Frag mal mit GetLastError() den zuletzt aufgetretenen Fehler auf und laß ihn Dir anzeigen...[ Dieser Beitrag wurde am 19.03.2003 um 10:52 Uhr von Hepi editiert. ]
-
Das heißt, ich bau da die Service Main und die Control Handler ein und probiers dann nochmal??
Aber warum kann der momentan den Dienst nicht erstellen?
-
Du brauchst keine ServiceMain... vergiß das mal ganz schnell wieder!
-
Naja! Und wie mach ich das dann?
bzw. jetzt beim Erstellen:
GetLastError liefert keinen übereinstimmenden Eintrag mit den Typen aus der MSDN. Liefert folgenden Fehlercode: 2011654497
-
sodala!
habs jetzt geschafft, den Dienst endlich wieder zu erstellen. nur er startet jetzt noch immer nicht!
Wie muss mein .exe - File ausschaun, damit das funktioniert??
-
kann ich ein hello world programm als service laufen lassen?? macht nicht viel sinn! aber ist es möglich???
cu