2017-09-06 134 views
0

因此,我创建了一个Windows服务,它在Windows 10中作为服务在Windows 7中作为控制台应用程序工作,但在Windows 7作为服务运行时它会自动停止。Windows服务作为控制台应用程序运行,但作为服务自动关闭

我按照这里DevX windows service steps

服务谈判的教程,我的司机,并通过执行CMD wmic diskdrive get pnpdeviceid提供特定设备的SERIALNUMBER。

最后这里的主要功能和ServiceMain函数

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; 
} 

`

这是我的安装服务

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

+0

@RbMm服务应该留在所有的时间和返回每当一个新的USB已插入序列号,当一个新的USB中插入。计算机驱动程序获取供应商ID和产品ID并将它们发送到执行该命令的服务,然后返回相应的序列号,这就是为什么我需要该服务停留在循环中并检查驱动程序的任何输入。 – qwn

+0

您需要添加错误检查,以便您可以找到代码失败的位置。此外,如果您在调用StartServiceCtrlDispatcher之前在main()中放置了一个适度的Sleep(),则可以附加一个调试器。 –

回答

0

好吧,我明白了,这是一个一堆错误。

我已经设置了FltSendMessage的计时器太长(100秒),我没有初始化FilterGetMessage中的OVERLAPPED结构,这意味着服务处于等待状态,直到从驱动程序输入任何信息。

它现在全部整理出来。感谢所有的帮助。

编辑: 我也搞砸了字符串匹配其断开服务

相关问题