2017-09-06 2 views
0

Also habe ich einen Windows-Dienst erstellt, der in Windows 10 als Dienst und auf Windows 7 als Konsolenanwendung funktioniert, aber wenn er in Windows 7 als Dienst ausgeführt wird, stoppt er automatisch .Windows-Dienst läuft als Konsolen-App, aber automatisch als Dienst heruntergefahren

Ich habe das Tutorial hier gefolgt DevX windows service steps

Der Service spricht mit meinem Fahrer und liefert die Seriennummer für bestimmte Geräte von cmd wmic diskdrive get pnpdeviceid ausführt.

Schließlich ist hier die Hauptfunktion und die Servicemain Funktion

VOID 
WINAPI ServiceMain(
    DWORD argc, 
    LPTSTR *argv 
) 
/* 
    Description: 
    Service Entry Point of the service. 
*/ 
{ 
statusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler); 

if (statusHandle == NULL) 
    return; 

// Tell the service controller we are starting 
RtlZeroMemory(&serviceStatus, sizeof(serviceStatus)); 
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
serviceStatus.dwControlsAccepted = 0; 
serviceStatus.dwCurrentState = SERVICE_START_PENDING; 
serviceStatus.dwWin32ExitCode = 0; 
serviceStatus.dwServiceSpecificExitCode = 0; 
serviceStatus.dwCheckPoint = 0; 

HRESULT result = ConnectToPort(&port); 

serviceStatus.dwCurrentState = SERVICE_RUNNING; 
SetServiceStatus(statusHandle, &serviceStatus); 

while (serviceStatus.dwCurrentState == SERVICE_RUNNING) { 
    result = GetInformationAndSendSerialNumber(&port); 
    if(SUCCEEDED(result)) Sleep(5000); 
} 

serviceStatus.dwControlsAccepted = 0; 
serviceStatus.dwCurrentState = SERVICE_STOPPED; 
serviceStatus.dwWin32ExitCode = 0; 
serviceStatus.dwCheckPoint = 3; 
SetServiceStatus(statusHandle, &serviceStatus); 
} 

INT 
main(
INT argc, 
PCHAR *argv 
) 
{ 
SERVICE_TABLE_ENTRY serviceTableEntry[] = 
{ 
    { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain}, 
    {NULL, NULL} 
}; 
StartServiceCtrlDispatcher(serviceTableEntry); 
return 0; 
} 

`

Dies ist, wie ich den Dienst installieren

sc create Test binpath= C:\Test.exe sc config Test start= auto

+0

@RbMm Der Dienst auf die ganze Zeit bleiben sollte und die Seriennummer zurückkehren, sobald eine neue USB angeschlossen ist Wenn ein neues USB um eingesteckt ist. Der Computer erhält die Hersteller-ID und die Produkt-ID und sendet sie an den Dienst, der den Befehl ausführt und gibt dann die entsprechende Seriennummer zurück. Deshalb muss der Dienst in der Schleife bleiben und auf Eingaben vom Treiber prüfen. – qwn

+0

Sie müssen eine Fehlerprüfung hinzufügen, damit Sie herausfinden können, wo genau der Code fehlschlägt. Wenn Sie einen einfachen Sleep() in main() einfügen, bevor StartServiceCtrlDispatcher aufgerufen wird, können Sie einen Debugger anhängen. –

Antwort

0

Ok ich habe es, es war ein Haufen Fehler.

Ich hatte den Timer für FltSendMessage zu lang (100 Sekunden) gesetzt, zusätzlich habe ich die OVERLAPPED-Struktur in FilterGetMessage nicht initialisiert, was bedeutete, dass der Dienst in den Wartezustand versetzt wurde, bis eine Eingabe vom Treiber kam.

Alles ist jetzt aussortiert. Danke für die Hilfe.

Edit: Auch geschraubt I String-Matching auf, die den Dienst getrennt