用C语言编写Windows服务程序的五个步骤

合集下载

libhv用法 -回复

libhv用法 -回复

libhv用法-回复Libhv是一个使用C语言编写的高性能、跨平台的网络库。

本文章将以"libhv用法"为主题,一步一步回答相关问题。

第一部分:什么是libhv?Libhv是一个开源的网络库,它旨在提供一个高性能、跨平台的网络编程框架。

它是使用C语言编写的,因此可以在各种操作系统上运行,如Windows、Linux、Mac OS等。

Libhv的目标是简化网络编程,并提供丰富的功能,使得开发者能够更容易地构建高性能的网络应用程序。

第二部分:libhv的特性有哪些?Libhv具有许多强大的特性,以下是一些主要的特性:1. 异步IO:Libhv使用异步IO模型,可以同时处理大量的并发连接。

2. 协程支持:Libhv提供了基于协程的编程模型,可以编写简洁、高效的代码。

3. 高性能:Libhv经过优化,具有出色的性能表现。

4. 跨平台支持:Libhv可以在各种操作系统上运行,如Windows、Linux、Mac OS等。

5. TCP/UDP支持:Libhv支持TCP和UDP协议,可以用于开发各种类型的网络应用程序。

6. SSL/TLS支持:Libhv支持SSL/TLS协议,可以保障网络通信的安全性。

7. 轻量级:Libhv的代码量很小,可以很容易地集成到你的项目中。

第三部分:如何使用libhv?使用libhv非常简单,以下是使用libhv的基本步骤:1. 安装libhv:你可以从libhv的官方网站上下载最新的版本。

下载完毕后,解压缩文件并将其拷贝到你的项目目录中。

2. 引入libhv:在你的项目中,需要包含libhv的头文件,并链接libhv 的库文件。

你可以在你的编译脚本中添加相应的编译选项来实现。

3. 初始化libhv:在你的代码中,需要先初始化libhv的环境。

你可以调用hv_init()函数来完成初始化操作。

4. 创建网络对象:你可以调用hv_getaddrinfo()函数来获取一个网络地址对象。

C语言概述

C语言概述

学习数据结构, C++的基石
绝对重要的基 石语言,Unix, Linux, Windows, JAVA,C++, C#底层实现都 靠C
1.2.1C/C++市场份额
为什么要学C语言呢?
C/C++是永不过时的贵族语言,请看世界计算机的权威排行榜
1.2.2 C语言适用的领域
计算机领域,C/C++大小通吃?
volatile while
const else goto return struct void
1.2.7C语言的9种控制语句
9种控制语句: if( )~else~ for( )~ while( )~ do~while( ) continue break switch goto return
1.2.8C语言的34种运算符
信息的存储单位
位(Bit):度量数据的最小单位
字节(Byte):最常用的基本单位, 一个字节有8位
b7 b6 b5 b4 b3 b2 b1 b0
1 0 0 1 0 1 0 1 = 27+ 24+ 22+ 20 =149
K 字节 M(兆)字节 G(吉) 字节 T(太)字节
1K = 1024 byte 1M = 1024 K 1G = 1024 M 1T = 1024 G
• 而今天,计算机遍布了我们生活的每一个角落,除了 人和人之间的相互交流之外,我们必须和计算机交流。 用什么样的方式和计算机做最直接的交流呢?人们自 然想到的是最古老也最方便的方式——语言
1.1基本常识
软件开发 人机交互方式 常用的DOS命令
1.1基本常识
什么是软件?
软件:一系列按照特定顺序组织的计算机数据和 指令的集合。

操作系统原理实验指导

操作系统原理实验指导
(3)计算页面命中率程序流程图
3、实验题
(1)设计一个内存分配模拟程序。假定在计算机系统作业后备队列中有六个等待调度运行的作业,参与分配的内存大小为32KB,采用简单页式管理,每个页帧的大小为1KB。根据要求进行内存的分配和回收。要求打印内存分配表。有关作业的组织和作业有关参数的设置请自行设计,要大致符合实际情况。
main()
{
int i;
if (fork())
{
i=wait();
printf(“It is parent process.\n”);
printf(“The child process, ID number %d, is finished.\n”,i);
}
else{
print(“It is child process.\n”);
(2)自选设计一个进程调度算法,并加以实现。
实验三存储器管理
1、目的与要求
目的:存储器管理是操作系统重要的组成部分,提高存储器的效率始终是操作系统研究的重要课题之一。虚拟存储技术是用来扩大存储容量的一种重要方法。学生应独立地使用一种开发工具或高级语言编写几个常用的存储分配算法,并能设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的理解,巩固所学的知识。
操作系统实验指导
操作系统是计算机的最重要的系统软件,它在计算机中具有核心地位,其作用是对计算机系统资源进行统一的调度和管理,提供各种强有力的系统服务,为用户创造灵活而又方便的使用环境。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分地发挥系统中各种资源的使用效率,提高系统工作的可靠性。
操作系统原理是计算机科学与技术专业的一门主要专业课程,它涉及计算机系统中各种软、硬资源管理的实现原理与方法,内容非常丰富,综合性非常强,并且还具有很强的实践性。只有把理论与实践紧密地结合起来,才能取得较好地学习效果。

第三章 计算机软件练习题

第三章  计算机软件练习题

第三章计算机软件习题一、判断题1.Windows系统中,不同文件夹中的文件不能同名。

()2.编写汇编语言程序比机器语言方便一些,但仍然不够直观简便。

()3.计算机软件包括软件开发和使用的所有涉及的资料。

()4.Windows系统中,每一个物理硬盘只能建立一个根目录,不同的根目录在不同的物理硬盘中。

()5.Java语言和C++语言都属于面向对象的程序设计语言。

()6.“软件使用手册”不属于软件的范畴。

()7.Windows系统中,可以象删除子目录一样删除根目录。

()8.软件必须依附于一定的硬件或软件环境,否则它可能无法正常运行。

()9.操作系统提供了“任务管理”、“文件管理”、“存储管理”、“设备管理”等多种功能。

()10.为了方便人们记忆、阅读和编程,汇编语言将机器指令采用助记符号表示。

()11.存储在磁盘中的MP3音乐都是计算机软件。

()12.Linux操作系统的源代码是公开的,它是一种“自由软件”。

()13.在某一计算机上编写的机器语言程序,可以在任何其它计算机上运行。

()14.Unix操作系统主要在PC机上使用。

()15.软件产品是交付给用户使用的一整套程序、相关的文档和必要的数据。

( )16.一般情况下,计算机加电后自动执行BIOS中的程序,将所需的操作系统软件装载到内存中,这个过程称为“自举”、“引导”或“系统启动”。

()17.一般将使用高级语言编写的程序称为源程序,这种程序不能直接在计算机中运行,需要有相应的语言处理程序翻译成机器语言程序才能执行。

()18.源程序通过编译程序的处理可以一次性地产生高效运行的目的程序,并把它保存在磁盘上,以备多次执行。

()19.当计算机完成加载过程后,操作系统即被装人到内存中运行。

()20.“引导程序”的功能是把操作系统从内存写入硬盘。

( )21.C++语言是对C语言的扩充。

( )22.MATLAB是将编程、计算和数据可视化集成在一起的一种数学软件。

( )23.P3是世界著名的项目管理软件。

计算机系统(课后习题答案)

计算机系统(课后习题答案)
DSP 芯片:称数字信号处理器,也是一种微控制器,其更适合处理高速的数字信号, 内部集成有高速乘法器,能够进行快速乘法和加法运算。
嵌入式系统:利用微控制器、数字信号处理器或通用微处理器,结合具体应用构成的 控制系统。
【1-6】冯·诺伊曼计算机的基本设计思想是什么? [答案]
采用二进制形式表示数据和指令。指令由操作码和地址码组成。 将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完 成计算任务。这就是“存储程序”和“程序控制”(简称存储程序控制)的概念。 指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移 指令实现。 计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定 了 5 部分的基本功能。
【2-6】将下列压缩 BCD 码转换为十进制数: (1)10010001 (2)10001001 (3)00110110
[答案] (1)91 (2)89 (3)36 (4)90
(4)10010000
【2-7】将下列十进制数用 8 位二进制补码表示: (1)0 (2)127 (3)-127 (4)-57
“计算机系统基础”习题解答
第 1 章 计算机系统概述
【1-1】简答题 (1)计算机字长(Word)指的是什么? (2)处理器的“取指-译码-执行周期”是指什么? (3)总线信号分成哪 3 组信号? (4)外部设备为什么又称为 I/O 设备? (5)Windows 的控制台窗口与模拟 DOS 窗口有什么不同? [答案] (1)处理器每个单位时间可以处理的二进制数据位数称计算机字长。 (2)指令的处理过程。处理器的“取指—译码—执行周期” 是指处理器从主存储器 读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作 (简称执行)的过程。 (3)总线信号分成 3 组,分别是数据总线、地址总线和控制总线。 (4)因为外设以输入(Input)和输出(Output)形式与主机交换数据。 (5)Windows 的控制台窗口是基于 32/64 位 Windows 操作系统,模拟 DOS 窗口是基于 16 位 DOS 操作系统。

5 MPLAB IDE软件安装

5 MPLAB IDE软件安装

手把手教你学PIC单片机C语言教程第5课(MPLAB IDE软件安装)一:PIC单片机开发环境的建立安装MPLAB IDEMPLAB集成开发环境(IDE)是一个综合的设计平台,适用于使用MicrochipPICmicro和dsPIC单片机进行嵌入式设计的应用开发。

上面提及软件开发的6个步骤中的1-5步骤,均需在此平台上完成。

MPLAB集成开发环境(IDE)完成的功能是:1.完成源程序的编写。

2.将源程序编译成目标代码。

3.配合硬件调试器、开发板完成软件的调试。

4.配合编程器将调试成功的目标代码写入到开发板的单片机中。

MPLAB IDE安装的具体步骤如下:先不要连接硬件,在赠送光盘中找到MPLAB IDE安装压缩文件“MPLAB_IDE_8_63.zip”,该文件也可以从Microchip网站下载,下载地址为:/downloads/en/DeviceDoc/MPLAB_IDE_8_53.zip选择该文件然后将它拷贝到电脑的硬盘中(一般拷贝到D:E:F:盘比较合适),然后双击已拷到电脑硬盘中的“MPLAB_IDE_8_63.zip”,将该文件解压缩,双击解压缩后的的文件setup.exe进行安装,安装完成后按系统提示重新启动计算机。

注意:1、如果打开配套例程时,屏幕显示“Unable to load the workspace because the format of the workspace file has changed”,说明您安装的MPLAB IDE版本太低,请到MICROCHIP网站(/)下载最新版的MPLAB IDE,进行升级安装就可以了。

2、Windows xp,windows7操作系统,需要管理员权限才能安装该软件。

以下为16F877A芯片的工程序建立,18F4520芯片工程的建立请直接看配套视频二:MPLAB IDE v8.63软件安装找到下面的安装位置:配套CD光碟\2、应用软件\5、MPLAB_IDE集成开发环境_v8_63。

第三章计算机软件习题

第三章计算机软件习题

第三章计算机软件习题一、判断题1.Windows系统中,不同文件夹中的文件不能同名。

()2.编写汇编语言程序比机器语言方便一些,但仍然不够直观简便。

()3.计算机软件包括软件开发和使用的所有涉及的资料。

()4.Windows系统中,每一个物理硬盘只能建立一个根目录,不同的根目录在不同的物理硬盘中。

()5.Java语言和C++语言都属于面向对象的程序设计语言。

()6.“软件使用手册”不属于软件的范畴。

()7.Windows系统中,可以象删除子目录一样删除根目录。

()8.软件必须依附于一定的硬件或软件环境,否则它可能无法正常运行。

()9.操作系统提供了“任务管理”、“文件管理”、“存储管理”、“设备管理”等多种功能。

()10.为了方便人们记忆、阅读和编程,汇编语言将机器指令采用助记符号表示。

()11.存储在磁盘中的MP3音乐都是计算机软件。

()12.Linux操作系统的源代码是公开的,它是一种“自由软件”。

()13.在某一计算机上编写的机器语言程序,可以在任何其它计算机上运行。

()14.Unix操作系统主要在PC机上使用。

()15.软件产品是交付给用户使用的一整套程序、相关的文档和必要的数据。

( )16.一般情况下,计算机加电后自动执行BIOS中的程序,将所需的操作系统软件装载到内存中,这个过程称为“自举”、“引导”或“系统启动”。

()17.一般将使用高级语言编写的程序称为源程序,这种程序不能直接在计算机中运行,需要有相应的语言处理程序翻译成机器语言程序才能执行。

()18.源程序通过编译程序的处理可以一次性地产生高效运行的目的程序,并把它保存在磁盘上,以备多次执行。

()19.当计算机完成加载过程后,操作系统即被装人到内存中运行。

()20.“引导程序”的功能是把操作系统从内存写入硬盘。

( )21.C++语言是对C语言的扩充。

( )22.MATLAB是将编程、计算和数据可视化集成在一起的一种数学软件。

( )23.P3是世界著名的项目管理软件。

visualc6.0简介及其优点 (1)

visualc6.0简介及其优点 (1)

Visual C++6.0简介及其优点VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。

Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。

VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说 VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。

VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的认识,笔者在这里还是以讲解WIN API的相关内容为主线。

要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的技术文档多以英文形式发布。

vc6.0的优点是界面简洁,占用资源少,操作方便。

1.3 利用Visual C++/MFC开发Windows程序的优势MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用C语言编写Windows服务程序的五个步骤

http://www.bccn.net/Article/kfyy/cyy/jszl/200603/3842.html Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并 实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。

当初我写第一个NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文章附带一个 C++ 例子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。我想理解通过什么框架,调用什么函数,以及何时调用,但 C++ 在这方面没有让我轻松多少。面向对象的方法固然方便,但由于用类对底层 Win32 函数调用进行了封装,它不利于学习服务程序的基本知识。这就是为什么我觉得 C 更加适合于编写初级服务程序或者实现简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用 C++ 编写才能游刃有余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用 C 所写的例子就非常容易解释 NT 服务之所以然。

服务是一个运行在后台并实现勿需用户交互的任务的控制台程序。Windows NT/2000/XP 操作系统提供为服务程序提供专门的支持。人们可以用服务控制面板来配置安装好的服务程序,也就是 Windows 2000/XP 控制面板|管理工具中的“服务”(或在“开始”|“运行”对话框中输入 services.msc /s——译者注)。可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务。

本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件的服务。然后指导你完成生成,安装和实现服务的整个过程。

第一步:主函数和全局定义 首先,包含所需的头文件。例子要调用 Win32 函数(windows.h)和磁盘文件写入(stdio.h):

#include #include

接着,定义两个常量: #define SLEEP_TIME 5000 #define LOGFILE "C:\\MyServices\\memstatus.txt"

SLEEP_TIME 指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环的时候要使用该常量。

LOGFILE 定义日志文件的路径,你将会用 WriteToLog 函数将内存查询的结果输出到该文件,WriteToLog 函数定义如下:

int WriteToLog(char* str) { FILE* log; log = fopen(LOGFILE, "a+"); if (log == NULL) return -1; fprintf(log, "%s\n", str); fclose(log); return 0; }

声明几个全局变量,以便在程序的多个函数之间共享它们值。此外,做一个函数的前向定义:

SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus;

void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); int InitService();

现在,准备工作已经就绪,你可以开始编码了。服务程序控制台程序的一个子集。因此,开始你可以定义一个 main 函数,它是程序的入口点。对于服务程序来说,main 的代码令人惊讶地简短,因为它只创建分派表并启动控制分派机。

void main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MemoryStatus"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL;

// 启动服务的控制分派机线程 StartServiceCtrlDispatcher(ServiceTable); }

一个程序可能包含若干个服务。每一个服务都必须列于专门的分派表中(为此该程序定义了一个 ServiceTable 结构数组)。这个表中的每一项都要在 SERVICE_TABLE_ENTRY 结构之中。它有两个域:

lpServiceName: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须指定; lpServiceProc: 指向服务主函数的指针(服务入口点);

分派表的最后一项必须是服务名和服务主函数域的 NULL 指针,文本例子程序中只宿主一个服务,所以服务名的定义是可选的。

服务控制管理器(SCM:Services Control Manager)是一个管理系统所有服务的进程。当 SCM 启动某个服务时,它等待某个进程的主线程来调用 StartServiceCtrlDispatcher 函数。将分派表传递给 StartServiceCtrlDispatcher。这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中每个服务 的 ServiceMain 函数(本文例子中只有一个服务)分派器还监视程序中所有服务的执行情况。然后分派器将控制请求从 SCM 传给服务。

注意:如果 StartServiceCtrlDispatcher 函数30秒没有被调用,便会报错,为了避免这种情况,我们必须在 ServiceMain 函数中(参见本文例子)或在非主函数的单独线程中初始化服务分派表。本文所描述的服务不需要防范这样的情况。

分派表中所有的服务执行完之后(例如,用户通过“服务”控制面板程序停止它们),或者发生错误时。StartServiceCtrlDispatcher 调用返回。然后主进程终止。

第二步:ServiceMain 函数 Listing 1 展示了 ServiceMain 的代码。该函数是服务的入口点。它运行在一个单独的线程当中,这个线程是由控制分派器创建的。ServiceMain 应该尽可能早早为服务注册控制处理器。这要通过调用 RegisterServiceCtrlHadler 函数来实现。你要将两个参数传递给此函数:服务名和指向 ControlHandlerfunction 的指针。

它指示控制分派器调用 ControlHandler 函数处理 SCM 控制请求。注册完控制处理器之后,获得状态句柄(hStatus)。通过调用 SetServiceStatus 函数,用 hStatus 向 SCM 报告服务的状态。

Listing 1 展示了如何指定服务特征和其当前状态来初始化 ServiceStatus 结构,ServiceStatus 结构的每个域都有其用途:

dwServiceType:指示服务类型,创建 Win32 服务。赋值 SERVICE_WIN32; dwCurrentState:指定服务的当前状态。因为服务的初始化在这里没有完成,所以这里的状态为 SERVICE_START_PENDING;

dwControlsAccepted:这个域通知 SCM 服务接受哪个域。本文例子是允许 STOP 和 SHUTDOWN 请求。处理控制请求将在第三步讨论;

dwWin32ExitCode 和 dwServiceSpecificExitCode:这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0;

dwCheckPoint 和 dwWaitHint:这两个域表示初始化某个服务进程时要30秒以上。本文例子服务的初始化过程很短,所以这两个域的值都为 0。

调用 SetServiceStatus 函数向 SCM 报告服务的状态时。要提供 hStatus 句柄和 ServiceStatus 结构。注意 ServiceStatus 一个全局变量,所以你可以跨多个函数使用它。ServiceMain 函数中,你给结构的几个域赋值,它们在服务运行的整个过程中都保持不变,比如:dwServiceType。

在报告了服务状态之后,你可以调用 InitService 函数来完成初始化。这个函数只是添加一个说明性字符串到日志文件。如下面代码所示:

// 服务初始化 int InitService() { int result; result = WriteToLog("Monitoring started."); return(result); }

在 ServiceMain 中,检查 InitService 函数的返回值。如果初始化有错(因为有可能写日志文件失败),则将服务状态置为终止并退出 ServiceMain:

error = InitService(); if (error) { // 初始化失败,终止服务 ServiceStatus.dwCurrentState = SERVICE_STOPPED;

相关文档
最新文档