如何在Windows服务程序中捕获SERVICE_CONTROL_SHUTDOWN代码

2024-04-25

我最近正在编写一个Windows服务程序。

我在编程时遇到的问题是,当我在 Windows 操作系统上安装程序时,它无法正常关闭。关闭系统需要很长时间。看来我的程序是问题的原因。

我试图在互联网上找到解决方案,我发现在我的代码中添加“SERVICE_CONTROL_SHUTDOWN”可以是解决方案。我这样做了,但是我的程序没有捕获“SERVICE_CONTROL_SHUTDOWN”,我不知道为什么......

有谁知道为什么会这样……谁能告诉我如何解决它? 谢谢。

我在下面放了我的代码片段。

// method that sets service status. 
void SvcSetStatus(DWORD dwState, DWORD dwAccept = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN )
        {
            SERVICE_STATUS ss;
            ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
            ss.dwCurrentState = dwState;
            ss.dwControlsAccepted = dwAccept;
            ss.dwWin32ExitCode = 0;
            ss.dwServiceSpecificExitCode = 0;
            ss.dwCheckPoint = 0;
            ss.dwWaitHint = 0;


            g_NowState = dwState; 
            SetServiceStatus(g_hSrv, &ss);

        }

// method of service handler 
void SvcHandler(DWORD fdwControl)
        {

            if (fdwControl == g_NowState)
            {
                return;

            }

            switch (fdwControl)
            {
                case SERVICE_CONTROL_PAUSE:

                    break;
                case SERVICE_CONTROL_CONTINUE:

                    break;
                case SERVICE_CONTROL_STOP:
                    ShutdownService(FALSE);
                    break;
                case SERVICE_CONTROL_INTERROGATE:
                    break;
                case SERVICE_CONTROL_PRESHUTDOWN:

                    ShutdownService(TRUE); //???
                    break;
                case SERVICE_CONTROL_SHUTDOWN:

                    ShutdownService(TRUE); //service finalize function (parameter is for shutdown or not)

                    break;
                default:
                    SvcSetStatus(g_NowState);
                    break;

            }
        }

我在编程时遇到的问题是,当我在 Windows 操作系统上安装程序时,它无法正常关闭。关闭系统需要很长时间。看来我的程序是问题的原因。

这通常意味着您在 SCM 停止/关闭请求期间没有正确报告状态。您没有显示您的代码ShutdownService(),但考虑到您的编码方式SvcHandler(),确保ShutdownService() calls SvcSetStatus(SERVICE_STOP_PENDING)在服务停止过程中定期调用SvcSetStatus(SERVICE_STOPPED)一旦服务完全停止。

此外,挂起的另一个可能原因可能是您的服务创建了顶级HWND其自身及其窗口过程未正确响应未处理的消息,例如通过调用DefWindowProc()。在关闭期间,某些消息会广播到顶级窗口,甚至在服务进程中,并且需要对其进行响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Windows服务程序中捕获SERVICE_CONTROL_SHUTDOWN代码 的相关文章

  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何从页眉和/或页脚确定 PE 可执行文件的大小

    假设您有要雕刻的数据流或字节块 如何确定可执行文件的大小 PE 可执行文件格式中有许多标头 但是我使用哪些标头部分来确定 如果可能 可执行文件的总长度 这是文件格式的图片 如果PE文件格式良好 计算可以简化为 伪代码 size IMAGE
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 让 Jenkins 对远程用户不可见

    我的本地 Windows 设备上有一个 Jenkins 服务器 但我想让它对外界不可见 有关服务器的办公室规则 明显且不隐晦的 效果令人满意的方法是设置防火墙规则来阻止对其端口的传入访问 但我认为必须有一个 Jenkins 设置来阻止它向除
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 了解事件的前一个处理程序是否返回 false。 IE < 9 中的默认阻止?

    我设置了一个全局模式 正在加载 请稍候 div 在一个应用程序中 它每次都会显示 a or a div
  • Visual Studio Code 安装位置

    我几天前安装了 Visual Studio Code 但现在在我的计算机上找不到可执行文件 它在哪里 我已经检查了程序和功能 我还检查了我的路径 由于某种原因 它也不在其中 更新 10 11 2018 如果您进行完全重新安装 包括卸载计算机
  • 函数定义上的纯说明符

    在 GCC 上编译时我得到了错误 函数定义上的纯说明符 但当我使用 VS2005 编译相同的代码时则不然 class Dummy error pure specifier on function definition VS2005 comp
  • 如果我是 Python 新手,我应该使用哪个版本的 Python?

    如果我对 Python 完全陌生 并且正在阅读有关将语句打印到控制台 变量类型 集合等的内容 我应该使用哪个版本的 Python 我知道有大量适用于 Python 2 6 x 的第三方库 但我担心我会学到一些不能很好地移植到 Python
  • Vala vapi 文件文档

    我想使用 Vala 破解现有的基于 GLib 的 C 项目 基本上我正在做的是 在构建过程开始时 使用 valac 从 vala 文件生成 c 和 h 文件 然后像编译任何 c 或 h 文件一样编译生成的文件 这可能不是最好的方法 但在大多
  • Total Blank Unity / Microsoft Store Build 未通过 WACK 测试

    我一直在努力为我的游戏取得成功统一 2018 2 1f1 and 视觉工作室 2017 15 8 0 尝试为 Windows 商店成功构建 打包 WACK 失败后所有 每个不同的配置 我尝试了完全空白默认Unity UWP平台应用程序 生成
  • 下边框边距

    有什么方法可以只在边框上添加边距吗 只有边框应该有边距 而不是文本 我正在尝试移动边框而不是文本字段 需要缩小 移动边框而不是文本 CSS margin check border bottom 1px solid d2d7da margin
  • (已解决)插件选项不允许使用多个值 androidx.compose.compiler.plugins.kotlin:reportsDestination

    我正在使用 Android Studio 与 Kotlin 进行 Android 开发 我的项目中有40多个Android模块 其中一些是Java模块 一些主题是android模块 Kotlin Version 1 8 20 Hilt Ve
  • 在 WinForms 表单之间传递数据[重复]

    这个问题在这里已经有答案了 我在项目中创建了一个辅助表单 它可以从主表单获取数据 并且在单击按钮时应将一些数据传递到主表单 这是代码 Add cs private void button1 Click object sender Event
  • 将响应缓冲区转换为 JSON

    在 AWS 中 我使用 https 模块通过 Lambda 发出 get 请求 我能够返回数据 但当我调用时它是缓冲区格式的callback null obj https get options res gt res on data d g
  • 为什么我无法计算正确的 HMAC 签名?

    我正在尝试在 Google Apps 脚本中计算 HMAC 签名 但文档并未 100 清楚地说明我需要如何传递参数 并且我无法获得预期的输出 为了确定我是否获得正确的输出 我将结果与已知良好的 PHP 代码进行比较 该代码是 key a2V
  • 如何为一系列任务设计执行引擎

    我正在尝试用 Java 编写一个问题 我必须执行一堆任务 Problem 执行由多个任务组成的作业 并且这些任务之间具有依赖关系 一个作业将有一个任务列表 每个这样的任务将进一步有一个后续任务列表 每个后续任务将有自己的后续任务 您可以在此
  • _ftol2_sse,有更快的选择吗?

    我有调用很多的代码 int myNumber int floatNumber 这总共占用了我大约 10 的 CPU 时间 根据分析器 虽然我可以就这样 但我想知道是否有更快的选择 所以我尝试四处搜索 并偶然发现 http devmaster
  • 如何使用jquery从字符串中获取第一个字母[重复]

    这个问题在这里已经有答案了 我对 jquery 的了解很差 我已经提到了下面的脚本 var header time col text alert header 我从如何获取第一个字母 例如 1 中得到了字符串 109 00AM 请你帮助我好
  • 无法从字符串中删除“\r\n”

    我有一个像这样的字符串 la lala 135 1039 921 r n 而且我无法删除 r n 最初这个字符串是一个字节对象 但后来我将它转换为字符串 我尝试过 strip r n 与 replace r n 但什么也没有 gt gt g
  • 为什么 HTTP 请求在 Chrome 中陷入挂起状态?

    语言 工具版本 角度 cli 1 2 0 PHP 7 0 8 Zend 表达 2 阿帕奇2 4 23 铬65 0 3325 181 Windows 7的 Issue 我有一个 Angular2 应用程序 它使用 PHP 应用程序作为所有 X
  • java以一种方式绘制矩形而不是同时使用两种方式

    你好 我在java中有一些代码可以绘制一个矩形 但是它只会向右拖动 即使我向左拖动它也会向右拖动 这是代码我有什么帮助吗 public void mouseDragged MouseEvent e Point p e getPoint in
  • 同时使用 POST 和 GET 的 HttpWebRequest

    我需要将用户重定向到http www someurl com id 2 http www someurl com id 2使用 POST 方法 是否可以 如果是 那么如何 现在我有以下内容 它正确转发 POST 数据 但它删除了 id 2
  • 如何在级联下拉列表中显示选定的值?

    我想要为编辑视图中的选定值扩展以下代码 以国家 gt 州 gt 城市为例 我有脚本 Cascading DropDown List js function bindDropDownList e targetDropDownList var
  • 如何在Windows服务程序中捕获SERVICE_CONTROL_SHUTDOWN代码

    我最近正在编写一个Windows服务程序 我在编程时遇到的问题是 当我在 Windows 操作系统上安装程序时 它无法正常关闭 关闭系统需要很长时间 看来我的程序是问题的原因 我试图在互联网上找到解决方案 我发现在我的代码中添加 SERVI