C++编写Windows服务程序

合集下载

Windows核心编程-内存管理

Windows核心编程-内存管理

使用虚拟内存



虚拟内存,最适合用来管理大型对象或 结构数组。 内存映射文件,最适合用来管理大型数 据流(通常来自文件)以及在单个计算 机上运行的多个进程之间共享数据。 内存堆栈,最适合用来管理大量的小对 象。
使用虚拟内存-VirtualAlloc
通过调用Vi r t u a l A l l o c函数,可以在进程的地址空间 中保留一个区域: LPVOID VirtualAlloc(
内存管理

当一个进程中的线程试图将数据写入一个共享内存块 时,系统就会进行干预,并执行下列操作步骤:



1) 系统查找R A M中的一个空闲内存页面。注意,当该模块 初次被映射到进程的地址空间时,该空闲页面将被页文件 中已分配的页面之一所映射。当该模块初次被映射时,由 于系统要分配所有可能需要的页文件,因此这一步不可能 运行失败。 2) 系统将试图被修改的页面内容拷贝到第一步中找到的页 面。该空闲页面将被赋予PA G E _ R E A D W R I T E或 PA G E _ E X E C U T E _ R E A D W R I T E保护属性。 原始页面的保护属性和数据不发生任何变化。 3) 然后系统更新进程的页面表,使得被访问的虚拟地址被 转换成新的R A M页面。
使用虚拟内存-提交


始终设法进行物理存储器的提交。每次调用Vi r t u a l A l l o c函数的时候,不要查看物理存储器是否已经映 射到地址空间区域的一个部分,而是让你的程序设法 进行内存的提交。系统首先查看内存是否已经被提交, 如果已经提交,那么就不要提交更多的物理存储器。 这种方法最容易操作,但是它的缺点是每次改变C E L L D ATA结构时要多进行一次函数的调用,这会使程 序运行得比较慢。 使用Vi r t u a l Q u e r y函数确定物理存储器是否已经 提交给包含C E L L D ATA结构的地址空间。如果已经 提交了,那么就不要进行任何别的操作。如果尚未提 交,则可以调用Vi r t u a l A l l o c函数以便提交内存。 这种方法实际上比第一种方法差,它既会增加代码的 长度,又会降低程序运行的速度(因为增加了对Vi r t u a l A l l o c函数的调用)。

c语言编程工具的总结

c语言编程工具的总结

Win-TC简介WIN-TC是一个TC2 WINDOWS平台开发工具,用于编写C语言程序。

该软件使用TC2为内核,提供WINDOWS平台的开发界面,因此也就支持WINDOWS平台下的功能,例如剪切、复制、粘贴和查找替换等。

而且在功能上也有它的独特特色例如语法加亮、C内嵌汇编、自定义扩展库的支持等。

并提供一组相关辅助工具令你在编程过程中更加游刃有余,如虎添翼。

WIN-TC是Turbo C 2.0(简称TC2.0)的一种扩展形式,是在TC2.0的基础上,增强了系统的兼容性和共享性,允许进行复制粘贴的多项可以用鼠标来操作的功能,比TC2.0使用起来方便。

WIN-TC主要特色1)在WINDOWS下编辑TC代码,可以充分利用WINDOWS的支持剪贴版和中文的特点;2)Include和Lib路径自动定位,告别TC设置路径的历史;3)编译错误捕捉功能,编译时不会出现烦人的DOS窗口;4)支持C内嵌汇编从而实现C/ASM混合编程;5)支持C扩展库(自定义LIB库);6)错误警告定位功能、出现编译错误时双击输出框里的出错行信息可以自动寻找到错误的行,就像DOS的TC那样;7)支持语法加亮功能,并可以自定义设置;8)没有目录路径限制,你甚至可以安装到带有空格的路径文件夹里;9)允许自定义设置输入风格,能够实现VC类似的输入风格;10)可选择是否生成ASM、MAP或OBJ文件,你甚至可以指定只生成EXE文件;11)稳定的文件操作功能,支持历史记录列表和使用模板;12)撤消和重复功能,并可以按照自己内存情况设置最多撤消次数(最多允许999次);13)具有行标计数的功能,并可以设置样式。

Turbo CTurbo C是美国Borland公司的产品,Borland公司是一家专门从事软件开发、研制的大公司。

该公司相继推出了一套 Turbo系列软件, 如Turbo BASIC, Turbo Pascal, Turbo Prolog, 这些软件很受用户欢迎。

microsoft visualc++2005

microsoft visualc++2005

microsoft visualc++2005(原创实用版)目录1.Microsoft Visual C++ 2005 简介2.Microsoft Visual C++ 2005 的特点3.Microsoft Visual C++ 2005 的应用领域4.Microsoft Visual C++ 2005 的优势与不足5.Microsoft Visual C++ 2005 的未来发展正文一、Microsoft Visual C++ 2005 简介Microsoft Visual C++ 2005是由微软公司开发的一款强大的C/C++编程集成开发环境(IDE)。

它为开发者提供了创建和维护Windows平台下的C/C++应用程序所需的全部工具,包括编辑器、调试器、链接器等。

自1992年首次发布以来,Visual C++已经历经多个版本更新,其中 2005 年发布的 Visual C++ 2005 是较为经典的一个版本。

二、Microsoft Visual C++ 2005 的特点1.强大的代码编辑功能:Visual C++ 2005 具备强大的代码编辑功能,支持语法高亮、自动补全、代码重构等特性,帮助开发者提高编程效率。

2.调试与测试功能:Visual C++ 2005 内置了功能强大的调试器,支持调试本地和远程应用程序,同时提供多种调试工具,如断点、单步执行、监视等,方便开发者定位和修复程序问题。

3.多语言支持:Visual C++ 2005 支持 C、C++以及 C++/CX 等编程语言,适应不同开发需求。

4.对 Windows API 的完全支持:Visual C++ 2005 完全支持 WindowsAPI,开发者可以使用 Visual C++ 2005 轻松创建 Windows 应用程序。

5.集成了.NET Framework:Visual C++ 2005 集成了.NET Framework,开发者可以使用 C++/CX 语言编写托管代码,实现与.NET 平台的无缝对接。

C_Winform程序设计1Windows窗体介绍

C_Winform程序设计1Windows窗体介绍
• • • • • •
创建窗体 为窗体添加控件 创建继承窗体 组织窗体上的控件 窗体的用途:自定义窗口 窗体的用途:创建多文档界面应用程序

Windows 窗体和 Web 窗体
创建窗体 设置窗体属性 窗体生命周期 处理窗体事件 Windows 窗体设计器生成的代码
特点
部署 图形
平台 编程模型 安全性
在其代码访问安全性实现中使用 通过验证请求者的凭据, 粒度权限,以保护计算机资源和 按URL控制获得访问Web应用 敏感信息 程序资源的授权

创建一个新的项目的同 时也创建了一个窗体
创建一个新窗体
1.

在解决方案资源管理 器中右键点击 “项 目”
单击“添加” 单击“添加Windows 窗体”
Windows窗体
可不必改注册表运行 GDI+
Web窗体
不需要下载和安装 交互或动态图形的更新需 要往返于服务器
响应
为需要交互的应用程序提供最快 可以利用浏览器的动态 的响应速度 HTML(DHTML)功能来创建丰 富的用户界面(UI)
要求在客户计算机上运行 .NET Framework 基于客户端Win32消息模式 只需浏览器 通过HTTP调用应用程序组 件
SDI
MDI
只有一个文档是可见的 打开一个文档之前,你必须关 闭另一个
同时显示多个文档 每个文档显示在它自己的窗口 中
• 创建一个父窗体
– 创建一个新项目 – 设置IsMdiContainer属性为True – 添加一个菜单项,来触发子窗体
• 创建一个子窗体
– 向项目添加一个新的窗体
• 从父窗体调用子窗体
2. 3.

窗体名:项目中窗体的名称

基于UDP的socket程序,多线程操作,windows下C语言

基于UDP的socket程序,多线程操作,windows下C语言

char recvBuf[50]="\0";
int len=sizeof(SOCKADDR);
sockaddr_in addrClient;
while(1)
{
recvfrom(s,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("他:\n %s\n",recvBuf);
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
DWORD WINAPI ThreadProc(LPVOID lpParameter) //次线程,发消息
tcpaddr2.sin_family=AF_INET;
tcpaddr2.sin_port=htons(5050); //发送端口5050
tcpaddr2.sin_addr.S_un.S_addr=inet_addr(ip);
int len=sizeof(SOCKADDR);
while(1)
{
printf("请输入服务端ip地址:");//程序接收端
char ip[16]="\0";
scanf("%s",ip);
//创建socket2
SOCKET s2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

如何在命令行脚本中启动带参数的Windows服务

如何在命令行脚本中启动带参数的Windows服务

如何在命令⾏脚本中启动带参数的Windows服务这是⼀个⼩问题:我们有⼀个⾃⼰编写的Windows服务,我们希望该服务在启动时可以根据⽤户输⼊的参数实现不同的功能。

要实现这样的需求并不是很难,下⾯这个例⼦我⽤来⽰范如何编写该服务using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Diagnostics;using System.Linq;using System.ServiceProcess;using System.Text;namespace WindowsServiceSample{public partial class SampleService : ServiceBase{public SampleService(){InitializeComponent();}/// <summary>/// 服务启动时触发/// </summary>/// <param name="args">⽤户可以设置的输⼊参数</param>protected override void OnStart(string[] args){if (args.Length > 0){EventLog.WriteEntry(string.Format("sample service is started with parameter :{0}", string.Join(",", args)));}else{EventLog.WriteEntry("sample service is started with non parameter");}}protected override void OnStop(){}}}在上述代码中,我区分了带参数启动和不带参数启动两种情况。

c#window服务的创建及参数说明

c#window服务的创建及参数说明

用Visual C#创建Wind ows服务程序及参数说明一.Windows服务介绍:Windows服务以前被称作NT服务,是一些运行在Windows NT、Windows 2000和Windows XP等操作系统下用户环境以外的程序。

在以前,编写Windows服务程序需要程序员很强的C或C++功底。

然而现在在Visual 下,你可以运用C++或Visual C#或Visual 很轻松的创建一个Windows服务程序。

同样,你还可以运用其他任何与CLR相容的语言来创建Windows服务程序。

本文就向大家介绍如何运用Visual C#来一步一步创建一个文件监视的Windows服务程序,然后介绍如何安装、测试和调试该Windows服务程序。

在介绍如何创建Windows服务程序以前,我先向大家介绍一些有关Windows服务的背景知识。

一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。

Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。

这些启动方式包括了自动启动和手动启动两种。

对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。

只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。

而对于手动启动的Windows 服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序(见图1)。

同样,一个Windows服务程序也不能像一般的应用程序那样被终止。

因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得Windows服务程序自动停止。

COM服务程序

COM服务程序

环境:Windows 2003,VC 6.0摘要:从建立一个COM服务程序入手,然后将一个MFC项目改造成服务程序,最后让这一程序在启动时可以显示图形界面。

关键字:windows服务程序COM服务程序开机前启动NT服务与桌面交互一、什么是windows的服务程序?可以使用下面的几种方法看到它。

1.打开控制面板,然后是管理工具,里面有一个“服务”,双击后打开;2.或者是通过输入命令的方式,打开开始菜单,点击运行,输入mmcservices.msc(mmc可省略),也可打开;我们会在打开的页面中看到一个大的列表,标题栏上包含有名称、描述、状态、启动类型、登录身份等项。

其中在状态一栏中显示为“已启动”的是系统中已经启动了的服务。

我们先看一下服务的属性。

举个例子,找到Print Spooler这一名称,然后用右键在上面点击,选择“属性”,可以看到它所执行的命令行是C:\WINDOWS\system32\spoolsv.exe,按下停止后,任务管理器中spoolsv.exe进程退出。

我们所见到的这个列表就是服务程序的集中地,每一项就是一个服务程序。

上面这些标为自启动的服务程序随系统一起启动。

它与一些修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion \Run项,及类似注册表项的程序不同的是,即使用户没有登录到系统中,它们也是会运行的,或者说它们在系统登录前运行。

二、怎么建立自己的服务程序?每一个服务程序对应注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下的一个子项。

因此我们可以通过增加注册表项的方式增加服务程序。

比如,我现在要增加一个test1服务程序,对应的可执行文件是c:\test1.exe。

那么我要增加如下注册表项:1.[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\]下增加子项test1;2.test1下增加:字符串型:"Description"="测试服务1"字符串型:"DisplayName"="test1-displayname"DWORD型:"ErrorControl"=dword:00000001可扩充字符串值(即文件所在路径):"ImagePath"=hex(2):43,00,3a,00,5c,00,74,00,65,00,73,00,74,0 0,31,00,2e,00,65,00,\78,00,65,00,00,00字符串型:"ObjectName"="LocalSystem"DWORD型,值为3表示是手动:"Start"=dword:00000003DWORD型:"Type"=dword:000000203.test1下增加子项:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\te st1\Security]里面的键值从其他的服务程序注册表值中复制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建服务程序除了编写服务代码外,还必须做一些其它额外的编码工作:
• 在系统日志或应用程序日志中报告警告信息和出错信息,不能用输出到屏 幕的方式,因为用户根本就没有登陆。 • 服务程序的控制即可以通过单独的应用程序,也可以通过控制面版程序。 这取决于你的服务实现什么样的通讯机制。 • 从系统中安装和卸载服务
简介
Windows NT 中 的 服 务 实 际 上 是 一 个 程 序 , 只 要 计 算 机 操 作 系 统 一 启 动 , 服 务就可以运行其中。它不需要用户登陆。服务程序是一种与用户无关的任务,比 如 目 录 复 制 , 进 程 监 控 或 网 络 上 供 其 它 机 器 使 用 的 服 务 , 比 如 HTTP 协 议 支 持 。
gSvcStatus.dwServiceSpecificExitCode = 0;
// Report initial status to the SCM ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );
// Perform service-specific initialization and work. ghSvcStopEvent = CreateEvent(
hEventSource = RegisterEventSource(NULL, szName);
if( NULL != hEventSource )
{ //StringCchPrintf(Buffer, 80, TEXT("%s failed with %d"), szFunction,
GetLastError()); strcpy(Buffer,szFunction); lpszStrings[0] = szName; lpszStrings[1] = Buffer;
用 C++ 创 建 简 单 的 Win32 服 务 程 序 作 者 : Nigel Thomson( MSDN 技 术 组 )
翻 译 : NorthTibet 原文出处:Creating a Simple Win32 Service in C++ 下载 NTService 例子源代码 下载 NTServCpl 例子源代码 下载 NTServCtrl 例子源代码
DWORD dwWin32ExitCode,
DWORD dwWaitHint)
static DWORD dwCheckPoint = 1;
// Fill in the SERVICE_STATUS structure.
gSvcStatus.dwCurrentState = dwCurrentState; gSvcStatus.dwWin32ExitCode = dwWin32ExitCode; gSvcStatus.dwWaitHint = dwWaitHint;
• NTServic e 是 一 个 简 单 的 Win32 服 务 , 它 就 是 用 本 文 所 描 述 的 方 法 建 立 的; • NTServC pl 是 一 个 控 制 面 版 程 序 , 用 来 控 制 NTServic e 服 务 ; • NTServC trl 是 一 个 独 立 的 程 序 例 子 , 用 它 可 以 监 控 某 个 Win32 服 务 ;
C++编写 Windows 服务程序
2010-10-28 18:16:05| 分类: vc++ |字号大中小 订阅
环境 VC6.0
#include "windows.h"
SERVICE_STATUS
gSvcStatus; //服务状态
SERVICE_STATUS_HANDLE gSvcStatusHandle; //服务状态句柄
while(1) {
// Check whether to stop the service. WaitForSingleObject(ghSvcStopEvent, INFINITE); ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 ); return; } } void ServerReportEvent(LPTSTR szName,LPTSTR szFunction) { HANDLE hEventSource; LPCTSTR lpszStrings[2]; unsigned int len = sizeof(szFunction); TCHAR *Buffer = new TCHAR[len];
创 建 Windows NT 服 务 程 序 并 不 是 很 难 。但 调 试 某 个 服 务 程 序 不 是 一 件 容 易 的 事 。 就 我 自 己 而 言 , 我 喜 欢 用 Visual C++ 编 写 自 己 的 C++ 程 序 。 大 多 数 Win32 服 务 都 是 用 C 写 的 , 所 以 我 觉 得 如 果 用 某 个 C++ 类 来 实 现 Win32 服 务 的 基 本 功 能 一 定 很 有 意 思 。有 了 这 个 C++ 类 ,谁 要 想 用 C++ 创 建 Win32 服 务 就 是 一 件 很 简 单 的 事 情 了 。 我 为 此 开 发 了 一 个 C++ 基 类 , 用 它 作 为 编 写 Win32 服 务 的 起 点 应 该 没 有 什 么 大 问 题 。
SERVER_NAME, SvcCtrlHandler);
if( !gSvcStatusHandle ) {
ServerReportEvent(SERVER_NAME,TEXT("RegisterServiceCtrlHandler")); return; }
// These SERVICE_STATUS members remain as set here gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; //只有一个 单独的服务
2,
// size of lpszStrings array
0,
// no binary data
lpszStrings,
// array of strings
NULL);
// no binary data
DeregisterEventSource(hEventSource);
}
}
VOID ReportSvcStatus( DWORD dwCurrentState,
void main()
{
SERVICE_TABLE_ENTRY DispatchTable[] = {
{ SERVER_NAME, (LPSERVICE_MAIN_FUNCTION)Server_main }, { NULL, NULL }
};
if (!StartServiceCtrlDispatcher(DispatchTable)) {
// Handle the requested control code. switch(dwCtrl)
{ case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
// Report running status when initialization is complete. ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );
// TO_DO: Perform work until service stops. ServerProgram(dwArgc, lpszArgv); //你需要的操作在此添加代码
if (dwCurrentState == SERVICE_START_PENDING) gSvcStatus.dwControlsAccepted = 0;
else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
if ( (dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED) ) gSvcStatus.dwCheckPoint = 0;
NULL, // default security attributes TRUE, // manual reset event FALSE, // not signaled NULL); // no name
if ( ghSvcStopEvent == NULL) {
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 ); return; }
摘要 本 文 描 述 如 何 用 Visual C++ 创 建 Windows NT 服 务 程 序 。 创 建 该 服 务 仅
用 到 一 个 C++ 类 , 这 个 类 提 供 服 务 与 操 作 系 统 之 间 一 个 简 单 的 接 口 。 使 用 这 个 类实现自己的服务非常简单,只要改写少数几个基类中的虚拟函数即可。在本文 有三个源代码参考例子:
HANDLE
ghSvcStopEvent = NULL;//服务停止句柄
#define SERVER_NAME TEXT("my_server") //服务名
VOID WINAPI ServerMain( DWORD, LPTSTR *); //服务入口点
void ServerReportEvent(LPTSTR szName,LPTSTR szFunction); //写 Windows 日志
相关文档
最新文档