因此,我创建了一个 Windows 服务,它在 Windows 10 中作为服务运行,在 Windows 7 中作为控制台应用程序运行,但是当在 Windows 7 中作为服务运行时,它会自动停止。
我已按照此处的教程 DevX windows service steps 进行操作
该服务与我的驱动程序对话,并通过执行 cmd wmic diskdrive get pnpdeviceid
提供特定设备的序列号。
最后是main函数和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 测试开始=自动
最佳答案
好吧,我明白了,这是一堆错误。
我为 FltSendMessage 设置的计时器太长(100 秒),而且我没有初始化 FilterGetMessage 中的 OVERLAPPED 结构,这意味着服务处于等待状态,直到来自驱动程序的任何输入。
现在一切都已经解决了。感谢您的所有帮助。
编辑: 我还搞砸了字符串匹配,从而断开了服务
关于c - Windows 服务作为控制台应用程序运行,但作为服务自动关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074598/