Windows服务开发实例
Windows Azure成功案例——文思海辉技术有限公司

文思海辉众包云平台 (1)背景 (1)解决方案 (2)技术架构 (3)优势 (4)系统整体效率提升40%左右 (4)系统扩展性和弹性得到了很大的提升 (5)系统总体SLA可以达到99.9% (6)系统运维成本大幅降低 (6)文思海辉技术有限公司(Pactera Technology International Ltd)是咨询与科技服务提供商,拥有全球运营能力、严格的质量标准和高效的交付流程。
自1995年以来,一直致力于为全球客户提供世界领先的商业/IT咨询、解决方案以及外包服务,在金融服务、高科技、电信、旅游交通、能源、生命科学、制造、零售与分销等领域积累了丰富的行业经验,主要客户涵盖众多财富500强企业及大中型中国企业。
文思海辉的前身分别是文思信息技术有限公司和海辉软件(国际)集团公司,这两家公司都是中国领先的软件外包服务提供商。
2012年8月11日文思信息与海辉软件宣布合并成立文思海辉技术有限公司,合并后的文思海辉人员规模成为中国软件外包行业之最,通过资源、业务的优势互补,为商业客户提供更优质的服务。
文思海辉通过将战略总部设在中国,并在北美、亚太地区、欧洲设立地区总部,文思海辉为客户提供零障碍沟通的个性化定制与最佳经济收益完美结合的优质服务。
通过位于美国、欧洲、澳大利亚、日本、新加坡、马来西亚和中国的交付中心,为客户提供企业应用服务、商业智能、应用开发与维护、移动解决方案、云计算、基础设施管理、软件开发与全球化、业务流程外包的一站式服务,满足客户对全球范围无缝交付和技术支持的需求,同时支持客户的业务发展战略,帮助客户赢得成功。
背景文思海辉基于多年的本地化业务和BPO业务经验积累,面向众包行业推出了一套完整的云计算解决方案。
目前,该方案主要应用于语言翻译和本地化领域,以远程协同工作和全球范围内资源共享为目标,支持文本、图片、音频、视频等多种媒体资源,结合完善的众包业务流程管理体系,为众包行业客户量身打造灵活、高效、先进、可扩展、低成本的业务支撑平台。
Windows下大容量服务器软件的开发与设计

Windows下大容量服务器软件的开发与设计摘要互联网的普及使得同时访问一个服务器的用户越来越多,本文通过详细对比几种winsock i/o方法的优缺点,分析了在服务器开发中如何使用iocp技术、重叠i/o技术、线程池技术、内存池等技术,并通过性能测试表明此服务器能够处理海量套接字连接请求,可以使服务器具有极佳的性能和强大的扩展能力,为开发大容量、可伸缩性服务器打下了良好的基础。
关键词服务器软件;完成端口;winsock;多线程中图分类号tp31 文献标识码a 文章编号 1674-6708(2012)59-0129-020引言服务器是指网络中能对其他机器提供某些服务的计算机系统软件或者设备。
服务器作为网络节点,存储、处理网络上80%的数据、信息,因此也被称为网络的灵魂。
对于用户来说,一台计算机所能承受的负荷是多多益善的。
微软公司winsock2中引入了内核级的完成端口(iocp)模型,iocp(i/o completion ports,i/o完成端口)技术是应用程序使用线程池处理异步i/o请求的一种机制,作为windows服务平台上一种比较成熟的i/o处理技术,完成端口模型可以利用为数不多的线程为成千上万的套接字同时提供网络服务,随着unix操作系统的广泛应用,套接字成为当前最流行的网络通信应用程序接口之一。
1 服务器总体设计完成端口技术是伸缩性最好的一种i/o模型,能随着系统内安装的cpu数量的增多而线性的提升服务器的性能。
把完成端口模型封装成一个比较普通的c++类,只要继承这个类,改写其中的两个虚函数(handledata和dataaction)就可以满足各种服务器的需要。
通过用acceptex代替accept和使用lookaside list来管理内存,服务器的性能有了较大的提升。
1.1本服务器的工作流程如下图所示:1.2 服务器各功能模块的实现服务器主要分为2个模块:主窗口模块、服务器模块。
基于工作过程的教材开发探索与实践——以windows server 2003服务器配置与管理为例

的过程中会遇到各种问题 , 也很容易进入误 区。有 的学校在短时间 内开发 了数量可观的“ 目 项 式课程 ”有 的学校将一些简单 的知识或 , 技能学习环节都 冠以“ 目” 项 的名称 , 这些都是对项 目式课程不理解
的产物。我对项 目 式课程 开发也是初步认识 , 现将在尝试过程 中的
心辐射知识传授与能力培养的课程内容体系改革原则 。它包括 : 以 完成任务 为核心 派生工作项 目; 以完成项 目为 目标派生 工作 职责 ; 以胜任工作职责为 目的重组理论 与实践 教学 内容。
ห้องสมุดไป่ตู้
项 目课程开发应该有多个项 目组成 , 目 源于哪里 , 项 来 是否必 须真实地来源于企 业, 这还是 我们需要研究 的内容 。按照真实性学
习理论 , 以来源于企业 的项 目为中心组织项 目 程 , 课 能最大 限度 地 发挥项 目 程的功能。但 在实践 中, 课 根本不可能根据教学内容及进 度的需要及 时从 企业获得 足够 的、 合适 的项 目。其实让每个学生都
■ 教研教改
基 于工作 过程的教材开发探 索与实践
以 w n o s evr 0 3 id w s e r 2 0 服务 器配置与 管理为例
顾 红 燕
( 苏州 工业职 业技 术 学院信 息工程 系 江 苏 ・ 苏州 250 ) 114
中图分类号 : 1 G7 2 文献标识码 : A 文章编号 : 2 7 9 ( 0 9)5 0 4 0 17 — 8 42 0 3— 4 — 2 6
能从事一个 来 自 企业 的项 目已经相 当不容易 。因而 , 目不一定要 项
求是真实 的 , 只要 能达到 提高教学 质量 的 目的 , 模拟项 目也可 以。
这就对开发者提 出要求 : 企业中的项 目转变 到课程 中去 , 将 符合 学
python实现监控windows服务并自动启动服务示例

python实现监控windows服务并⾃动启动服务⽰例使⽤Python 2.7 + pywin32 + wxpython开发每隔⼀段时间检测⼀下服务是否停⽌,如果停⽌尝试启动服务。
进⾏服务停⽌⽇志记录AppMain.py复制代码代码如下:#!/usr/bin/env python#-*- encoding:utf-8 -*-"""1. 每隔⼀分钟检测⼀次服务状态2. 如果发现服务状态已经停⽌,那么尝试启动服务3. ⾃动记录⽇志4. 任务栏图标显⽰"""import sys;reload(sys);sys.setdefaultencoding('utf-8');import win32service;import logging;from logging.handlers import RotatingFileHandler;import os.path;import wx;import AppResource;import webbrowser;from AppXml import *;C_APP_NAME = "Service Moniter 1.0";C_LOG_DIR = os.path.altsep.join([os.path.curdir,'service.log']);C_CONFIG_PATH = os.path.altsep.join([os.path.curdir,'config.xml']);C_LOG_SIZE = 1048576;C_LOG_FILES = 3;C_APP_SITE = "/?app=service_moniter&version=1.0.0";class ServiceControl(object):def __init__(self):self.scm = win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS);# 检查服务是否停⽌def isStop(self,name):flag = False;try:handle = win32service.OpenService(self.scm,name,win32service.SC_MANAGER_ALL_ACCESS);if handle:ret = win32service.QueryServiceStatus(handle);flag = ret[1]!=win32service.SERVICE_RUNNING;win32service.CloseServiceHandle(handle);except Exception,e:logging.error(e);return flag;# 开启服务def start(self,name):try:handle = win32service.OpenService(self.scm,name,win32service.SC_MANAGER_ALL_ACCESS);if handle:win32service.StartService(handle,None);win32service.CloseServiceHandle(handle);except Exception,e:logging.error(e);# 退出def close(self):try:if self.scm:win32service.CloseServiceHandle(self.scm);except Exception,e:logging.error(e);# 初始化⽇志def InitLog():logging.getLogger().setLevel(logging.ERROR);RtHandler = RotatingFileHandler(filename=C_LOG_DIR,maxBytes=C_LOG_SIZE,backupCount=C_LOG_FILES);RtHandler.setLevel(logging.ERROR);RtHandler.setFormatter(logging.Formatter('[%(asctime)s][%(levelname)s] %(message)s'));logging.getLogger().addHandler(RtHandler);logging.error('监控开始执⾏');# 系统托盘图标class TaskIcon(wx.TaskBarIcon):def __init__(self):wx.TaskBarIcon.__init__(self);self.SetIcon(AppResource.TaskIcon.getIcon(),C_APP_NAME);self.ID_NAME = wx.NewId();self.ID_EXIT = wx.NewId();self.ID_AUTHOR = wx.NewId();self.Bind(wx.EVT_MENU,self.OnExitEvent,id=self.ID_EXIT);self.Bind(wx.EVT_MENU,self.OnHelpEvent,id=self.ID_AUTHOR); def OnHelpEvent(self,event):webbrowser.open_new(C_APP_SITE);def OnExitEvent(self,event):wx.Exit();def CreatePopupMenu(self,event=None):menu = wx.Menu();menu.Append(self.ID_NAME,C_APP_NAME);menu.AppendSeparator();menu.Append(self.ID_AUTHOR,"技术⽀持");menu.Append(self.ID_EXIT,"退出");return menu;# 隐藏窗⼝class Frame(wx.Frame):def __init__(self,timelen,services):wx.Frame.__init__(self,parent=None,title=C_APP_NAME);self.timelen = timelen*1000;self.services = services;self.Show(False);self.Bind(wx.EVT_TIMER,self.OnTimerEvent);self.Bind(wx.EVT_CLOSE,self.OnExitEvent);self.timer = wx.Timer(self);self.timer.Start(self.timelen);def OnTimerEvent(self,event):sc = ServiceControl();for name in self.services:print name;if sc.isStop(name):logging.error('系统检测到服务[%s]停⽌'%(name,));sc.start(name);sc.close();def OnExitEvent(self,event):if self.timer:self.timer.Stop();self.timer = None;# 进程class Application(wx.App):def OnInit(self):# 初始化配置xml = XmlNode();if not xml.LoadFile(C_CONFIG_PATH):logging.error('配置⽂件不存在');return False;timelen = xml.FindNode('time').GetInt();if timelen<=0:logging.error('监控间隔时间必须⼤于0秒');return False;services = xml.FindNode('services').GetChildrenList(tag='item'); if len(services)==0:logging.error('监控服务列表不能为空');return False;self.taskbar = TaskIcon();self.frame = Frame(timelen,services);return True;def OnExit(self):logging.error('监控停⽌执⾏');self.frame.Close();self.taskbar.RemoveIcon();self.taskbar.Destroy();if __name__ == '__main__':InitLog();app = Application();app.MainLoop();AppXml.py复制代码代码如下:#!/usr/bin/env python#-*- encoding:utf-8 -*-"""XML操作封装"""import os.path;import logging;import xml.etree.ElementTree as ElementTree;class XmlNodeValue(object):STRING = 1;INT = 2;FLOAT = 3;BOOL = 4;class XmlNodeMap(object):ATTR = 1;TEXT = 2;NODE = 3;class XmlNode(object):def __init__(self,currentNode=None,rootNode=None):self.currentNode = currentNode;self.rootNode = rootNode;# 加载XML⽂件def LoadFile(self,path):if os.path.isabs(path): path = os.path.abspath(path);flag = False;try:self.rootNode = ElementTree.parse(path);if self.rootNode is not None: flag = True;self.currentNode = self.rootNode;except Exception,e:logging.error("XML⽂件加载失败");logging.error(e.__str__());return flag;# 加载XML内容def LoadString(self,data):if data is None or len(data.strip())==0: return False;flag = False;try:self.rootNode = ElementTree.fromstring(data);if self.rootNode is not None: flag = True;self.currentNode = self.rootNode;except Exception,e:logging.error("XML内容加载失败");logging.error(e.__str__());return flag;# 检查数据是否载⼊正确def IsLoad(self):return self.currentNode is not None and self.rootNode is not None;# 返回根节点对象def GetRoot(self):return XmlNode(self.rootNode,self.rootNode);# 查找节点,开始为“/”从根节点开始查找,否则从当前节点查找def FindNode(self,path):if path is None or len(path.strip())==0: return XmlNode(None,self.rootNode);path = path.strip();node = None;if path[0]=='/':node = self.rootNode.find(path[1:]);else:node = self.currentNode.find(path);return XmlNode(node,self.rootNode);# 查找多节点def FindNodes(self,path):if path is None or len(path.strip())==0: return XmlNode(None,self.rootNode);if path[0]=='/':nodes = self.rootNode.findall(path[1:]);else:nodes = self.currentNode.findall(path);return [XmlNode(node,self.rootNode) for node in nodes];# 获取⼦节点列表def GetChildrens(self,tag=None):return [XmlNode(node,self.rootNode) for node in self.currentNode.iter(tag=tag)]; # 格式化数据def GetFormatData(self,node,type):if type==XmlNodeValue.STRING:v = node.GetStr();elif type==XmlNodeValue.INT:v = node.GetInt();elif type==XmlNodeValue.FLOAT:v = node.GetFloat();elif type==XmlNodeValue.BOOL:v = node.GetBool();else:v = node.GetData();return v;# 获取⼦节点内容列表# valueFormat 值类型 1 字符串,2 整数,3 ⼩数,4 布尔值def GetChildrenList(self,tag=None,valueFormat=XmlNodeValue.STRING):data = [];for node in self.GetChildrens(tag=tag):data.append(self.GetFormatData(node,valueFormat));return data;# 获取⼦节点Map表# keyType 1 使⽤属性值 2 使⽤⼦节点# keyName 属性值名称或⼦节点名称# valueType 1 使⽤属性值 2 使⽤⼦节点# ValueName 属性值名称或⼦节点名称defGetChildrenMap(self,tag=None,keyType=XmlNodeMap.ATTR,keyName="name",valueType=XmlNodeMap.TEXT,valueName=None,valueFormat=XmlNodeValue.STRING): data = {};for node in self.GetChildrens(tag=tag):k,v = None,None;if keyType==XmlNodeMap.ATTR:if keyName is None or len(keyName.strip())==0: continue;k = node.GetAttrs().GetStr(keyName);elif keyType==XmlNodeMap.NODE:if keyName is None or len(keyName.strip())==0: continue;t = node.FindNode(keyName);if not t.IsLoad(): continue;k = t.GetStr();elif keyType==XmlNodeMap.TEXT:k = node.GetStr();else:continue;if k is None or len(k.strip())==0: continue;if valueType==XmlNodeMap.ATTR:if valueName is None or len(valueName.strip())==0: continue;v = self.GetFormatData(node.GetAttrs(),valueFormat);elif valueType==XmlNodeMap.NODE:if valueName is None or len(valueName.strip())==0: continue;t = node.FindNode(valueName);if t.IsLoad():v = self.GetFormatData(t,valueFormat);elif valueType==XmlNodeMap.TEXT:v = self.GetFormatData(node,valueFormat);else:v = None;data[k] = v;return data;# 获取节点名称def GetTag(self):if self.currentNode is None: return "";return self.currentNode.tag;# 获取节点内容def GetData(self,default=None):if self.currentNode is None: return default;return self.currentNode.text;def GetStr(self,default="",strip=True):data = self.GetData();if data is None: return default;try:data = str(data.encode("utf-8"));if data is None:data = default;else:if strip:data = data.strip();except Exception,e:print e;data = default;return data;def GetInt(self,default=0):data = self.GetData();if data is None: return default;try:data = int(data);if data is None: data = default;except Exception:data = default;return data;def GetFloat(self,default=0.0):data = self.GetData();if data is None: return default;try:data = float(data);if data is None: data = default;except Exception:data = default;return data;def GetBool(self,default=False):data = self.GetData();if data is None: return default;data = False;if self.GetStr().lower()=="true" or self.GetInt()==1: data = True; return data;# 获取节点属性def GetAttrs(self,default={}):return XmlAttr(self);class XmlAttr(object):def __init__(self,node):self.node = node;self.InitAttrs();# 获取Nodedef GetNode(self):return self.node;# 设置Nodedef SetNode(self,node):self.node = node;self.InitAttrs();# 初始化Node属性列表def InitAttrs(self):if self.node is None or self.node.currentNode is None:self.attrs = {};self.attrs = self.node.currentNode.attrib;# 获取属性def GetAttrs(self):if self.attrs is None: self.InitAttrs();return self.attrs;# 获取指定属性def GetData(self,key,default=None):data = self.attrs.get(key);if data is None : data = default;return data;def GetStr(self,key,default="",strip=True):data = self.GetData(key);if data is None: return default;try:data = str(data.encode("utf-8"));if data is None:data = default;else:if strip:data = data.strip();except Exception:data = default;return data;def GetInt(self,key,default=0):data = self.GetData(key);if data is None: return default;try:data = int(data);if data is None: data = default;except Exception:data = default;return data;def GetFloat(self,key,default=0.0):data = self.GetData(key);if data is None: return default;try:data = float(data);if data is None: data = default;except Exception:data = default;return data;def GetBool(self,key,default=False):data = self.GetData(key);if data is None: return default;data = False;if self.GetStr(key).lower()=="true" or self.GetInt(key)==1: data = True;return data;# 测试if __name__ == "__main__":node = XmlNode();print node.LoadFile(r"config.xml");print node.FindNode("engine/headers").GetChildrenMap("header",XmlNodeMap.ATTR,"name",XmlNodeMap.TEXT,None,XmlNodeValue.STRING); AppResource.py复制代码代码如下:#----------------------------------------------------------------------# This file was generated by C:\Python27\Scripts\img2py#from wx.lib.embeddedimage import PyEmbeddedImageTaskIcon = PyEmbeddedImage("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""SUVORK5CYII=")config.xml复制代码代码如下:<?xml version="1.0" encoding="utf-8" ?><config><!-- 需要监控的服务名称列表 --><services><item>Dhcp</item></services><!-- 间隔时间(单位秒) --><time>10</time></config>。
WCF接口实例介绍

WCF接⼝实例介绍Windows Communication Foundation(WCF)是由微软开发的⼀系列⽀持数据通信的应⽤程序框架,可以翻译为Windows 通讯开发平台。
WCF整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有和的相关技术。
简单的归结为四⼤部分1>.⽹络服务的协议,即⽤什么开放客户端接⼊。
2>.业务服务的协议,即声明服务提供哪些业务。
3>.数据类型声明,即对客户端与服务器端通信的数据部分进⾏⼀致化。
4>.传输安全性相关的定义。
下⾯直接看⼀个例⼦:⼀.服务端实例1.定义⼀个WCF接⼝名称未Ichangeline服务契约(ServiceContract),订定服务的定义。
// 注意: 使⽤“重构”菜单上的“重命名”命令,可以同时更改代码和配置⽂件中的接⼝名“IStaffLoginCheckService”。
[ServiceContract] //服务协定定义public interface IChangeline{[OperationContract] // 操作服务定义string EsopCheckOk();[OperationContract]string HelloWorld();}2.定义⼀个类实现接⼝名称Changeline// 注意: 使⽤“重构”菜单上的“重命名”命令,可以同时更改代码和配置⽂件中的类名“StaffLoginCheckService”。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]public class Changeline : IChangeline{public string HelloWorld(){string result = "123456";return result;}}3.开通WCF所需要的服务,也可以从VS直接添加WCF服务1#region启动WCF服务2private void OpenWcfService()3 {4try5 {6var changeline = new Changeline(bendview);7 host = new ServiceHost(changeline, new Uri("http://localhost:8734/MyService/"));8//这是我们服务的地址9 host.AddServiceEndpoint(typeof(IChangeline), new BasicHttpBinding(), string.Empty);10 host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });11//mex元数据的地址12 host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),13"mex");14 host.Open();15var port = "8734"; //获取端⼝号16var inname = "Changeline"; //打开端⼝号的名称17var str = " netsh advfirewall firewall add rule name=" + inname +18" dir=in action=allow protocol=TCP localport= " + port;19var pro = new Process(); //实例化进程20 pro.StartInfo.FileName = "cmd.exe"; //设置要运⾏的程序⽂件21 eShellExecute = false; //是否使⽤操作系统shell程序启动22 pro.StartInfo.RedirectStandardInput = true; //是否接受来⾃应⽤程序的调⽤23 pro.StartInfo.RedirectStandardOutput = true; //是否接受来⾃应⽤程序的输出信息24 pro.StartInfo.RedirectStandardError = true; //是否接受重定向错误信息25 pro.StartInfo.CreateNoWindow = true; //不显⽰窗⼝信息26 pro.Start(); //启动程序2728//向cmd窗⼝发送输⼊信息29 pro.StandardInput.WriteLine(str + "&exit");3031 pro.StandardInput.AutoFlush = true;32 pro.WaitForExit(); //等待程序运⾏完退出程序33 pro.Close(); //关闭进程34 }35catch (Exception ex)36 {37 Tool.Log.Error("WCF开起失败:" + ex.Message);38 }39 CheckWCFServerTh = new Thread(WCF_HostCheck);40 CheckWCFServerTh.IsBackground = true;41 CheckWCFServerTh.Start();42 }43void WCF_HostCheck(object o)44 {45//Closed 指⽰通信对象已关闭,且不再可⽤。
Windows服务程序

大连现代高技术发展有限公司 数字医疗事业部医疗软件部 刘兴
主要内容
1.Windows服务程序介绍 2.使用VC++开发Windows服务程序
一、WindowБайду номын сангаас服务程序介绍
在2000/XP等基于NT的操作系统中,有 一个服务控制管理器SCM(Service Control Manager),它管理的后台进程被称为服务 (Service)。 服务是一种应用程序类型,它在后台悄 悄运行。我们通过将自己的程序登记为服务, 可以使自己的程序不出现在任务管理器中, 并且随系统启动而最先运行,随系统关闭而 最后停止。
2)如果你想使用MFC的类,请在工程 文件StdAfx.h文件的#include <atlbase.h> 前面加上#include<afxwin.h>一行,以包括 MFC头文件。 3)如果你想使用部门自己的类库,请 在#include<afxwin.h>下加上自己的诸如 MCMN.h头文件(只是一个建议,可以在需 要的地方包含相关头文件) 。如果出现编 译错误,请在部门自己的类库前面包含诸 如#include <afxcmn.h>、#include <afxext.h>头文件。
二、使用VC++/MFC开发 Windows服务程序
2.1 用 ATL工程 编写服务程序
1.步骤 首先,我们新建一个Project。如下图所示:
选择 “ATL COMAppWizard”,工程名为: ServiceDemo。点击 “OK ”进入一下步。
选择Service [EXE]。点击 Finish。
4)如果你想使用部门自己的类库,请在 “Project->Setting->General”的“Microsoft Foundation Classes”选项中选择“Use MFC in a Shared DLL”项以去掉一些警告(MSDN 说这些警告是正常的)。
Windows下Thrift环境搭建与示例

Windows下Thrift环境搭建与示例目录WINDOWS下THRIFT环境搭建与示例 (1)目录 (2)1.引言 (3)2.环境搭建 (4)1.1.JAVA环境 (4)1.2.T HRIFT环境 (4)3.THRIFT的基本概念 (4)1.3.数据类型 (4)1.4.服务端编码基本步骤: (5)1.5.客户端编码基本步骤: (5)1.6.数据传输协议 (5)4.实例演示 (6)4.1.THRIFT生成代码 (6)4.1.1.创建thrift文件 (6)4.1.2.编译thrift文件 (6)4.2.代码实现 (7)4.2.1.实现服务端接口 (7)4.2.2.TSimpleServer服务端 (8)4.2.3.客户端 (9)4.3.依赖库设置 (12)4.4.运行 (12)1.引言本文档介绍windows环境下thrift的环境搭建与开发。
IDE为Eclipse,语言为Java。
Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。
它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。
官网地址:参考:/soa/rpc/thrift-sample//jnb/jnbJun2009.html/thrift/static/files/thrift-20070401.pdf/search-engine/thrift-for-windows//search-engine/thrift-rpc/2.环境搭建1.1.java环境下载JDK和ANT,并且配置环境变量。
测试是否配置成功,如下:下载安装Eclipse,用于java程序的开发。
1.2.Thrift环境下载Thrift: /download解压thrift-0.9.1.tar.gz,复制到C盘。
VB编写Windows服务管理程序

用2008编写Windows服务管理程序Visual Studio2008正式发布后吸引了大量的编程人员,为了由原来的Visual Studio2005转换为最新的Visual Studio2008不少公司也重新配置了计算机硬件设备,从而得以正常平稳的使用最新的开发工具。
Visual Studio2008在一些特性上也做出了许多的改进,访问Windows系统内核也更为方便。
本文将介绍用Visual Studio2008来开发一个Windows服务的管理程序,让读者了解到程序是怎样来获取Windows系统服务的。
希望能够给 学习者带来帮助。
打开Visual Studio 2008在文件(File) 菜单上,单击新建项目(New Project)。
在新建项目(New Project) 对话框的模板(Templates) 窗格中,单击Windows 应用程序(Windows Application)。
单击确定(OK) 如图1。
图1选择Form1窗体,在Form1窗体中添加如下控件:ListView1控件、4个按钮控件分别为:Button1、Button2、Button3、Button4我们需要对这些控件Name重新命名,相关属性设置如下:ListView1属性Name:WindowsServices属性FullRowSelect:true属性GridLines:true属性ViewDetails控件名称属性值属性值Button1属性Name: cmdRefresh属性Text: 恢复Button2属性Name: cmdStop属性Text: 停止服务Button3属性Name: cmdStart属性Text: 开始服务Button4属性Name: cmdExit属性Text: 退出控件布局界面效果如图2图2选择ListView1控件我们需要为此控件添加列<编辑列>,选中后右上方会出现符号如图3图3我们需要添加成员,成员名列表如下:如图4 Name:lchCaptionsText:服务项目Name:lchNamesText:文件名称Name:lchStateText:状态图4 好了界面工作已经完成,按照图5设置即可图5注意,在输入代码之前,我们需要添加引用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#Windows服务程序开发实例介绍C#Windows服务程序开发实例程序的目的和用途:很多开机启动程序仅仅加在启动项里面,只有登陆后才真正启动。
windows服务在开机未进行用户登录前就启动了。
正是利用这一点,解决一些服务器自动重启后特定软件也自动启动的问题。
C#Windows服务程序开发1.新建一个服务项目 visual C#----windows----windows服务;C#Windows服务程序开发2.添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。
在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和LogFilePath。
分别用于存储目标的路径、日志路径。
我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。
在dataset中提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。
C#Windows服务程序开发3.program.cs文件作为程序入口,代码如下:ing ;ing System.ServiceProcess;ing System.Text;space WindowsServices_AutoStart5.{6.static class Program7.{8./// ﹤summary﹥9./// 应用程序的主入口点。
10./// ﹤/summary﹥11.static void Main()12.{13.ServiceBase[] ServicesToRun;14.// 同一进程中可以运行多个用户服务。
若要将15.// 另一个服务添加到此进程中,请更改下行以16.// 创建另一个服务对象。
例如,17.//18.// ServicesToRun = new ServiceBase[] {19.new Service1(), new MySecondUserService()};20.//21.ServicesToRun = new ServiceBase[] {22.new WindowsServices_AutoStart() };23.ServiceBase.Run(ServicesToRun);24.}25.}26.}ing ;ing System.ServiceProcess;ing System.Text;space WindowsServices_AutoStart31.{32.static class Program33.{34./// ﹤summary﹥35./// 应用程序的主入口点。
36./// ﹤/summary﹥37.static void Main()38.{39.ServiceBase[] ServicesToRun;40.// 同一进程中可以运行多个用户服务。
若要将41.// 另一个服务添加到此进程中,请更改下行以42.// 创建另一个服务对象。
例如,43.//44.// ServicesToRun = new ServiceBase[] {45.new Service1(), new MySecondUserService()};46.//47.ServicesToRun = new ServiceBase[] {48.new WindowsServices_AutoStart() };49.ServiceBase.Run(ServicesToRun);50.}51.}52.}C#Windows服务程序开发4.service.cs主文件,代码如下:53.view plaincopy to clipboardprint?ing System;ing ;ing ponentModel;ing System.Data;ing System.IO;ing System.Diagnostics;ing System.ServiceProcess;ing System.Text;space WindowsServices_AutoStart63.{64.public partial class65.WindowsServices_AutoStart : ServiceBase66.{67.public WindowsServices_AutoStart()68.{69.InitializeComponent();70.}71.string StartAppPath ="";72.//@"F:\00.exe";73.string LogFilePath ="";74.// @"f:\WindowsService.txt";75.protected override void OnStart(string[] args)76.{77.string exePath = System.Threading.78.Thread.GetDomain().BaseDirectory;79.//80.if (!File.Exists(exePath + @"\ServiceAppPath.xml"))81.{82.dsAppPath ds = new dsAppPath();83.object[] obj=new object[2];84.obj[0]="0";85.obj[1]="0";86.ds.Tables["dtAppPath"].Rows.Add(obj);87.ds.Tables["dtAppPath"].WriteXml(88.exePath + @"\ServiceAppPath.xml");89.return;90.}91.try92.{93.dsAppPath ds = new dsAppPath();94.ds.Tables["dtAppPath"].ReadXml(95.exePath + @"\ServiceAppPath.xml");96.DataTable dt = ds.Tables["dtAppPath"];97.StartAppPath = dt.Rows[0]98.["StartAppPath"].ToString();99.LogFilePath = dt.Rows[0]100.["LogFilePath"].ToString();101.}102.catch { return; }103.if (File.Exists(StartAppPath))104.{105.try106.{107.Process proc = new Process();108. = StartAppPath; //注意路径109.// = "";110.proc.Start();111.}112.catch (System.Exception ex)113.{114.//MessageBox.Show(this, "找不到帮助文件路径。
115.文件是否被改动或删除?\n" + ex.Message, "提示",116. MessageBoxButtons.OK, rmation); 117.}118.FileStream fs = new FileStream(LogFilePath,119.FileMode.OpenOrCreate, FileAccess.Write);120.StreamWriter m_streamWriter = new StreamWriter(fs); 121.m_, SeekOrigin.End);122.m_streamWriter.WriteLine("WindowsService:123.Service Started" + + "\n");124.m_streamWriter.Flush();125.m_streamWriter.Close();126.fs.Close();127.}128.}129.protected override void OnStop()130.{131.try132.{133.// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
134.FileStream fs = new FileStream(LogFilePath,135. FileMode.OpenOrCreate, FileAccess.Write);136.StreamWriter m_streamWriter = new StreamWriter(fs); 137.m_, SeekOrigin.End);138.m_streamWriter.WriteLine("WindowsService:139. Service Stopped " + + "\n");140.m_streamWriter.Flush();141.m_streamWriter.Close();142.fs.Close();143.}144.catch145.{146.}147.}148.}149.}ing System;ing ;ing ponentModel;ing System.Data;ing System.IO;ing System.Diagnostics;ing System.ServiceProcess;ing System.Text;space WindowsServices_AutoStart159.{160.public partial class161.WindowsServices_AutoStart : ServiceBase162.{163.public WindowsServices_AutoStart()164.{165.InitializeComponent();166.}167.string StartAppPath ="";168.//@"F:\00.exe";169.string LogFilePath ="";170.// @"f:\WindowsService.txt";171.protected override void OnStart(string[] args) 172.{173.string exePath = System.174.;175.//176.if (!File.Exists(exePath + @"\ServiceAppPath.xml")) 177.{178.dsAppPath ds = new dsAppPath();179.object[] obj=new object[2];180.obj[0]="0";181.obj[1]="0";182.ds.Tables["dtAppPath"].Rows.Add(obj);183.ds.Tables["dtAppPath"].WriteXml(184.exePath + @"\ServiceAppPath.xml");185.return;186.}187.try188.{189.dsAppPath ds = new dsAppPath();190.ds.Tables["dtAppPath"].ReadXml(191.exePath + @"\ServiceAppPath.xml");192.DataTable dt = ds.Tables["dtAppPath"];193.StartAppPath = dt.Rows[0]194.["StartAppPath"].ToString();195.LogFilePath = dt.Rows[0]196.["LogFilePath"].ToString();197.}198.catch { return; }199.if (File.Exists(StartAppPath))200.{201.try202.{203.Process proc = new Process();204. = StartAppPath; //注意路径205.// = "";206.proc.Start();207.}208.catch (System.Exception ex)209.{210.//MessageBox.Show(this, "211.找不到帮助文件路径。