不使用 Visual Studio 创建 Windows 服务

2024-01-09

因此,使用 Visual Studio 创建 Windows 服务相当简单。我的问题更深入一些,即什么实际上使可执行文件可作为服务安装以及如何将服务编写为直接的 C 应用程序。我找不到很多关于此的参考资料,但我假设必须有一些我可以实现的接口,以便我的 .exe 可以作为服务安装。


将可执行文件设置为服务是其中的一部分,但实际上它通常由您使用的任何安装软件来处理。您可以在测试时使用命令行 SC 工具(或者如果您不需要安装程序)。

重要的是你的程序必须在启动时调用 StartServiceCtrlDispatcher()。这会将您的服务连接到服务控制管理器,并设置一个 ServiceMain 例程,它是您的服务主要入口点。

ServiceMain(您实际上可以将其命名为任何您喜欢的名称,但它似乎总是 ServiceMain)然后应该调用 RegisterServiceCtrlHandlerEx() 来定义回调例程,以便操作系统可以在发生某些事件时通知您的服务。

以下是我几年前编写的服务的一些片段:

设置为服务:

SERVICE_TABLE_ENTRY ServiceStartTable[] =
{
   { "ServiceName", ServiceMain },
   { 0, 0 }
};

if (!StartServiceCtrlDispatcher(ServiceStartTable))
{
   DWORD err = GetLastError();
   if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
      return false;
}

服务主要:

void WINAPI ServiceMain(DWORD, LPTSTR*)
{
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0);

服务处理程序:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*)
{
    switch (ControlCode)
    {
    case SERVICE_CONTROL_INTERROGATE :
        // update OS about our status
    case SERVICE_CONTROL_STOP :
        // shut down service
    }

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

不使用 Visual Studio 创建 Windows 服务 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • glut、glew dll:二进制文件不是使用调试信息构建的

    这是我得到的输出 abc exe Loaded C Windows system glut32 dll Binary was not built with debug information abc exe Loaded C Windows
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 如何在Android中注册睡眠事件?

    我正在开发 Android 3 0 我需要在我的应用程序中知道设备何时进入睡眠 关闭屏幕 我如何注册此意图 事件 以便在发生这种情况时我能够运行一些操作 BroadcastReceiver 中是否有任何通知此操作的操作 This http
  • 图库中的图像自动旋转 - Android

    在我的 Android 应用程序中 我正在从设备库加载图像 在这方面 我面临着有关图像方向的问题 当我从图库加载高分辨率图像时 它们会自动旋转然后显示在我的视图中 我尝试了有关此问题的各种解决方案 但无法得到正确的解决方案 我提到获取方向
  • 如何正确转义 Makefile 的数据?

    我正在动态生成config mk带有将由 Makefile 使用的 bash 脚本 该文件的构造如下 cat gt config mk lt
  • DMA 与中断驱动的 I/O

    我不太清楚 DMA 和中断 I O 之间的区别 当前正在阅读操作系统概念 第 7 版 具体来说 我不确定在这两种情况下何时会发生中断 以及在这两种情况下 CPU 在什么时候可以自由地执行其他工作 我一直在读但不一定能调和的东西 中断驱动 通
  • 为什么 ICC 在 x86 上的汇编中生成“inc”而不是“add”?

    在摆弄简单的 C 代码时 我注意到一些奇怪的事情 ICC为何产生incl eax在为增量生成的汇编代码中而不是addl 1 eax 不过 GCC 的行为符合预期 使用add 示例代码 O3用于 GCC 和 ICC int A B C D E
  • 如何在 Windows 上使用 GCC 11.1 构建 Qt 5.13.2?

    我已经使用 GCC MinGW w64 在 Windows 上成功构建 Qt 5 很长时间了 当我在 GCC 11 1 上尝试相同的操作时 构建失败并出现奇怪的错误消息 我该怎么做才能让它发挥作用 我自己使用以下方法构建了编译器develo
  • 是否可以在不进行额外分配的情况下移动和修改向量?

    考虑以下代码 let u Vec
  • 文件恢复软件如何工作?

    我想做一些简单的文件恢复软件 我想尝试恢复通过按 Shift Delete 删除的文件 我在 Windows 中工作 任何人都可以向我展示任何可以帮助我以编程方式执行此操作的链接或文档吗 我了解 C C NET 有什么指点吗 据我所知 文件
  • Python Poetry 的依赖版本语法

    The Poetry https github com sdispater poetry项目是Python的依赖管理系统 它使用新的pyproject toml https www python org dev peps pep 0518
  • 从 CloudKit 获取 CKAsset 图像非常慢

    我使用 CloudKit 作为我的 iOS 应用程序的服务器后端 我用它来容纳一些相对静态的数据以及一些图像 CKAsset 当我需要从公共数据库中实际获取这些资产时 我遇到了问题 它们的加载速度极其缓慢 我的用例是将图像加载到集合视图内的
  • 如何从 std::thread 更改 GUI?

    首先 我尝试使用setVisible from thread 有一个事件 void MainWindow OnShow Start OnShow actions ui gt LoadingBox gt setVisible true std
  • 如何让 Observable 返回转换后的项目数组 (Rxjs)

    我有一个生成 json 产品列表的端点 我在产品代码中定义了一个自定义类类型 我试图从端点获取数据 并将产品的 json 数组转换为 Product 类的数组 示例 API json 根据我的实际数据简化 products id 1 nam
  • 多次打开和关闭 php 标签会增加页面负载吗? [复制]

    这个问题在这里已经有答案了 可能的重复 开始 结束标签和性能 https stackoverflow com questions 2437144 opening closing tags performance 这是一个新手问题 但我在网上
  • Python `in` 与 `__contains__` 的功能

    我实施了 contains 前几天第一次在课堂上使用该方法 但其行为并不符合我的预期 我怀疑其中有一些微妙之处in https docs python org 2 library operator html我不明白的运算符 我希望有人能启发
  • 通过静态构造函数创建 ALV 时的 NULL 对象引用。为什么?

    我正在尝试运行从教程复制的这个程序 但我在这一行得到 Null 异常 CALL METHOD list gt SET TABLE FOR FIRST DISPLAY 我的理解是列表对象应该在类构造函数中创建 Method CLASS CON
  • Postman 获取环境名称作为变量

    我想知道是否可以将环境名称作为 Postman 中的环境变量 目前 我正在每个环境的环境变量中手动设置它 但它可以从某种应用程序变量中检索 这会很棒 我在文档中找不到任何内容 这应该为您提供当前选择的环境的名称 pm environment
  • PHP 中的 DOM 文档

    我刚刚开始阅读有关 DOM 的文档和示例 以便抓取和解析文档 例如 我的部分文档如下所示 div table tr td Crap td tr tr td width 172 valign top a href link img heigh
  • 为什么 PEP-8 指定最大行长度为 79 个字符? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将参数传递到 ASP .NET 页面

    我最近开始使用 ASP NET 但我对其他 NET 框架非常熟悉 我正在开发的应用程序需要将字符串索引作为命令行样式参数 现在 在我的 Page 类中 我有一个 const 字符串 我将其用作占位符 所以我的问题是两个人 1 如何设置应用程
  • 不使用 Visual Studio 创建 Windows 服务

    因此 使用 Visual Studio 创建 Windows 服务相当简单 我的问题更深入一些 即什么实际上使可执行文件可作为服务安装以及如何将服务编写为直接的 C 应用程序 我找不到很多关于此的参考资料 但我假设必须有一些我可以实现的接口