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
@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
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. –