如何编写windows服务程序
看了一篇文章《用C 语言编写Windows 服务程序的五个步骤》。但可能由于译者的疏忽,忘记了将关键代码放入该文档,导致初学者可能会看不懂。所以又查阅了相关资料。自己完成了《用C 语言编写Windows 服务程序的五个步骤》中的样例程序。在本文中我希望能给初学者一些帮助,大致讲一下编写windows服务程序需要的知识。首先Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。服务是有状态的,当我们使用windows自带的服务管理程序scexe查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进行控制的。你最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状态是系统自定义的状态,可通过msdn查看其他状态。这个状态信息你会在scexe中看到。在编写windows服务程序过程中你需要关注的函数有:1首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函数为main 而不是WinMain()。在主函数要做的主要工作就是初始化一个SERVICE_TABLE_ENTRY 分派表结构体,然后调用StartServiceCtrlDispatcher();这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。此过程示例代码如下:SERVICE_TABLE_ENTRY entrytable[2]; entrytable[0]lpServiceName="testservice"; entrytable[0]lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; entrytable[1]lpServiceName=NULL; entrytable[1]lpServiceProc=NULL;StartServiceCtrlDispatcher(entrytable);在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。2.ServiceMain函数为void WINAPI ServiceMain(int argc, char argv)格式的函数,函数名字可以任意定义。它的作用就是:将你需要执行的任务放到该函数中循环执行即可。这就是服务程序的工作函数。在ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。我们进行如下赋值:servicestatusdwServiceType = SERVICE_WIN32; servicestatusdwCurrentState = SERVICE_START_PENDING; servicestatusdwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令 servicestatusdwWin32ExitCode = 0; servicestatusdwServiceSpecificExitCode = 0; servicestatusdwCheckPoint = 0; servicestatusdwWaitHint = 0; hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);CtrlHandler为void WINAPI CtrlHandler(DWORD request)型的函数,函数名字可以任意设定。将在下一点讲到。Hstatus为SERVICE_STATUS_HANDLE类型的全局变量。当需要改变服务状态时SetServiceStatus()函数需要它做为参数来标识一个服务。3 void WINAPI CtrlHandler(DWORD request),函数的主要功能是,接收系统传递的控制命令,比如当你通过scexe关闭服务时,该函数会收到SERVICE_CONTROL_STOP消息,你就可以对服务进行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN和SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。这样一个基本的服务程序就完成了。下面贴出我的示例代码仅供参考。#include #include #define SLEEP_TIME 5000 //间隔时间#define FILE_PATH "C:\\logtxt" //信息输出文件bool brun=false;SERVICE_STATUS servicestatus;SERVICE_STATUS_HANDLE hstatus; int WriteToLog(char str);void WINAPI ServiceMain(int argc, char argv);void WINAPI CtrlHandler(DWORD request);int InitService(); int WriteToLog(char str){ FILE pfile; fopen_s(&pfile,FILE_PATH,"a+"); if (pfile==NULL) { return -1; } fprintf_s(pfile,"%s\n",str); fclose(pfile); return 0;} void WINAPI ServiceMain(int argc, char argv){ servicestatusdwServiceType = SERVICE_WIN32; servicestatusdwCurrentState = SERVICE_START_PENDING; servicestatusdwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令 servicestatusdwWin32ExitCode = 0; servicestatusdwServiceSpecificExitCode = 0; servicestatusdwCheckPoint = 0; servicestatusdwWaitHint = 0; hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler); if (hstatus==0) { WriteToLog("RegisterServiceCtrlHandler failed"); return; } WriteToLog("RegisterServiceCtrlHandler success"); //向SCM 报告运行状态 servicestatusdwCurrentState = SERVICE_RUNNING; SetServiceStatus (hstatus, &servicestatus); //下面就开始任务循环了,你可以添加你自己希望服务做的工作 brun=true; MEMORYSTATUS memstatus; char str[100]; memset(str,'\0',100); while (brun) { GlobalMemoryStatus(&memstatus); int availmb=memstatusdwAvailPhys/1024/1024; sprintf_s(str,100,"available memory is %dMB",availmb); WriteToLog(str); Sleep(SLEEP_TIME); } WriteToLog("service stopped");} void WINAPI CtrlHandler(DWORD request){ switch (request) { case SERVICE_CONTROL_STOP: brun=false; servicestatusdwCurrentState = SERVICE_STOPPED; break; case SERVICE_CONTROL_SHUTDOWN: brun=false; servicestatusdwCurrentState = SERVICE_STOPPED; break; default: break; } SetServiceStatus (hstatus, &servicestatus); }void main(){ SERVICE_TABLE_ENTRY entrytable[2]; entrytable[0]lpServiceName="testservice"; entrytable[0]lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; entrytable[1]lpServiceName=NULL; entrytable[1]lpServiceProc=NULL; StartServiceCtrlDispatcher(entrytable);} 如何安装服务:运行命令提示符 cmdexe输入sc create testservicename binpath= D:\testexe输入sc start testservicename 启动服务输入sc query 会在最底部显示你的服务当前的状态输入sc stop testservicename 停止服务输入sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。
您好
1,您可以先从其他地方,到电脑管家论坛新版发布区下载一个电脑管家离线安装包。
2,然后打开电脑管家——杀毒——全盘查杀,看电脑中是否有木马病毒,如果有的话查杀掉。
3,然后再打开电脑管家——电脑加速——对您的电脑开机项进行一个优化。
4,再使用电脑管家——工具箱——硬件检测——驱动安装,看您的网卡驱动是否被病毒破坏了,因为显示红色的×,一般就是本地线路连接失败和网卡驱动未安装。
如果还有其他疑问和问题,欢迎再次来电脑管家企业平台进行提问,我们将尽全力为您解答疑难
启动Windows应用程序的常用方式
[方法一]
第一步:在桌面上单击“开始”一“程序”。
第二步:移动鼠标到想要运行的应用程序名上。
第三步:单击。
[方法二]
第一步:在桌面上或文件夹窗口中移动鼠标到想要运行的应用程序图标上。
第二步:双击[方法三]第一步:用键盘上的箭头键选中应用程序图标,或用鼠标单击选中。
第三步:按回车键。
[方法四]
第一步:在“我的电脑”或“Windows资源管理器”窗口中,单击选中想要运行的应用程序图标。
第二步:单击“文件”菜单一“打开”。
[方法五]
第一步:在“我的电脑”或“Windows资源管理器”窗口中,单击选中任意非可执行程序文件图标(文本、图像等)。
第二步:单击“文件”菜单一“打开方式”。
第三步:在对话框中选定要使用的程序,指定是否“始终使用该程序打开这些文件”。如果对话框程序列表中没有合用的程序,单击“其他…”另选可以使用的程序。
第四步:单击“确定”,依次关闭对话框并启动应用程序(计算机基础知识 )。
[方法六]
第一步:在桌面上单击“开始”一“运行”。
第二步:在输入框中键入想要运行的应用程序位置和名称;或者单击对话框中的“浏览”,选定程序所在的磁盘驱动器、文件夹及程序名。
第三步:单击“确定”,依次关闭对话框并启动应用程序。
怎样启动电子邮件程序Outlook Express第一步:在Windows桌面上双击信封状的“Outlook Express”图标,或者移动鼠标到任务栏左端单击“Outlook Express”小图标,或者单击“开始”一“程序”一“Outlook Express”。程序启动之后,在建立了“拨号连接”的情况下,会出现询问是否连网的“连接到”对话框。单击“连接到”对话框中的“连接”按钮,可以立即连接到Internet网;单击“脱机工作”按钮,可以在不连网的状态下使用“Outlook Express”。
第二步:如果是第一次启动“Outlook Express”,会出现“Internet连接向导”,在“显示名”文本框中输自己的姓名或任意数字或字母。单击“下一步”。
第三步:在“电子邮件地址”文本框中输入电子邮件地址。这个地址可以是从网上申请的免费邮箱,也可以是ISP提供的收费邮箱。单击“下一步”。
第四步:在“接收邮件服务器”文本框中输入电子邮件服务商提供的“接收邮件服务器”的域名或地址,在“发送邮件服务器”文本框中输入电子邮件服务商所提供的“发送邮件服务器”的域名或地址。如果是通过ADSL连接入网,则应在“发送邮件服务器”文本框中输入ADSL服务商提供的“发送邮件服务器”的域名或地址。单击“下一步”。
第五步:在“账户名”文本框中输入电子邮件的用户名;在“密码”文本框中输入电子邮件的密码。单击“下一步”。
第六步:单击“完成”按钮,出现“Outlook Express”窗口。进入“Outlook Express”窗口后即可接收和发送电子邮件。
第七步:移动鼠标到菜单栏,单击“工具”一“发送和接收”一“发送和接收全部邮件”,也可以直接单击工具栏上的“发送/接收”,开始接收邮件。
第八步:接收的邮件全部存放在“收件箱”中,“收件箱”旁边标有邮件的数字。单击打开“收件箱”,再单击打开表示邮件的一个个小信封,即可阅读收到的邮件。
第九步:单击Out-Iook Express窗口右上角的“关闭(×)”按钮,退出程序。
POP3方式使用免费E-mail邮箱方法POP3方式就是利用专门的E-mail软件,如Windows系统中集成的Outlook Express,就可以直接在自己的计算机上接收和发送E -mail,而不必使用浏览器。这种方式要比Web页面方式灵活和方便。但是,不是所有的免费邮箱都具有POP3功能,申请时要注意有关网站的使用说明。
第一步:在Windows桌面上双击信封状的“Outlook Express”图标,或者移动鼠标到任务栏左端单击“Outlook Express”小图标,或者单击“开始”一“程序”一“Outlook Ex-press”,都可以启动“Outlook Express”邮件收发程序。
第二步:如果是第一次启动“OutlookExpress”,会出现一个电子邮件设置向导,但是我们经常使用的是日常设置,日常设置启动以
后和向导是一样的。移动鼠标到菜单栏单击“工具”一“账户”。
第三步:在出现的“Internet账户”对话框中单击右上角的“添加”一“邮件”,启动“Internet连接向导”(计算机基础知识 )。
第四步:这个向导和第一次启动“Outlook Express”的向导是完全一样的。按照向导指引,在“姓名”栏中可键人用户自己的名字或任意名字;在“电子邮件地址”栏中键人申请好的免费E - mail地址,如:abc001@sinacom;在“邮件接收(POP 3)服务器”栏中填入在申请免费邮箱时从使用说明中记下的设置,这里是“pop3sinacomcn”;在“邮件发送(SMTP)服务器”栏中填入用户本地的邮件服务器地址或申请时记下的'设置,这里是“smtpsinacomcn”。如果在这一步设置完成后,系统询问“指定的电子邮件地址可能无效,是否继续使用该地址?”,应选择“是”。这主要是因为许多免费地址中的域名说明部分与常规不同,系统误以为是用户搞错了。
第五步:现在许多免费E-mail服务器都设置了发信身份验证,这里的设置方法是:返回“Outlook Express”主窗口,移动鼠标到菜单栏单击“工具”一“账户”一“邮件”,在列表框中选定abc001,单击右边的“属性”一“服务器”,然后在下边的“我的服务器要求身份验证”前的复选框中打上“√”,再单击“应用”一“确定”退出即可。
第六步:在“Outlook Express”主窗口单击工具栏上的“发送/接收”,只要网络连接设置没有问题,就可以顺利连接Internet收发E- mail。单击左侧窗格的“收件箱”文件夹,可以方便从容地阅读从免费邮箱中接收到自己电脑中的邮件。
Web页面方式使用免费E-mail邮箱以Web页面方式使用免费E- mail邮箱就是在线收、发、读、写电子邮件,这种方式的好处是不论身处何地,只要有电脑能上网,就可以通过Internet Explorer等浏览器在线收发读写E - mail。
第一步:启动浏览器连接到Internet,在地址栏输入电子邮箱所在网站的网址,如畅捷网苑“2911免费邮件”的网址“http://mail2911net”,单击回车打开登录页面。
第二步:分别在“用户”、“密码”框内键入“用户名(abc001)”和“密码(abc321)”,单击红色的“GO”按钮或者键入回车,就进入了自己的免费邮箱主窗口页面。
第三步:收取信件。在邮箱主窗口左边单击“收新邮件”,即可打开收件箱,浏览收到的新邮件情况。一般这也是主窗口打开时的缺省状态。在没有读过的邮件名上单击,屏幕上就会显示出邮件内容。通常收到的第一封信就是“欢迎使用2911免费电子邮件”,这是畅捷网自动发给每个人的。信读完以后,如果不想再保留,可以单击邮件前面的复选框,然后单击“删除”;或者单击下面“移动选择下拉列表”中的“垃圾箱”,将选中邮件移动到垃圾箱里去。
第四步:写信和发信。在邮箱主窗口页面中,单击“写新邮件”,打开写信窗口。在该窗口中,用户可在“收件人”栏中填入收件人的E - mail地址;在“主题”栏中填入新邮件的主题;如有必要,还可以在“抄送”栏中填入其他收件入的E-mail地址,将该邮件同时发给第三者,“暗送”同“抄送”的意思差不多,也是寄出一个邮件副本给需要的收件人。接下来,就可以在下面的内容框中写信了。信写好后如果暂时不想发出,或者信写到一半要关机,可以选择把信存入“草稿夹”,另找时间上网发出或续写;如果要立即发出,单击“立即发送信”按钮,即将写好的当前E -mail发送出去。稍候片刻,系统就会提示发送成功。
通常,为了节省网费,可以提前在电脑上把信写好,在上 网发信时,可以在写信窗口单击“选取附件”框左边的“浏览”按钮,找到保存在电脑中的事先写好的信,单击“选取附件”,把信作为附件发送出去。第五步:除基本的收发信外,还可以使用“自动转发”、“自动回复”、“邮件过滤”等功能,操作结束后,单击红色的“Exit”按钮,即可退出邮箱。
Windows XP免费收发传真方法第一步:各项设置完成以后,打开一个Windows系统下的文本编辑工具,如Word 2000,准备好传真内容(撰写或从别处复制等)后单击“文件”菜单一“发送”一“传真收件人”。
第二步:在随后弹出的“传真发送向导”对话框中,键入收件人姓名、“位置”、“传真号码”等。如果是往外地传真,还要加上长途区号,设置“拨号规则”;如果要将传真文件发送多人,可以在各项中逐个输入收件人的相关信息后,单击“添加”。设置结束单击“下一步”。
第三步:在“准备首页”对话框中选择首页模板,并可以通过右侧的预览窗口预览模板文件;在主题行中键入传真文件主题,并根据需要填写备注信息。此信息将被自动添加到传真文件的首页。完成后,单击“下一步”。
第四步:在“计划”对话框中指定何时发送传真,并对该传真文件设置优先值,到此传真发送向导设置完成。如果设置的是立即发送,单击“完成”,传真文件就会被立刻发送出去。
第五步:当有传真发来时,电脑如果处于开机状态,根据电话铃声设置,会自动启动传真工具接收传真文件。接收完成后在系统的任务栏中出现一个接收到新传真文件的图标,同时系统会将传真文件以图形文件的格式,保存在设置好的文件夹中。我们可以在“传真控制台”中进行查看,也可以通过一些看图工具直接对传真文件进行浏览。如果电脑未开机,那就没有办法收到传真。
怎样配置Windows XP的传真功能?第一步:将具备收发传真功能的调制解调器安装并连接好。
第二步:打开“控制面板”。
第三步:双击“打印机和传真”,出现窗口。
第四步:在窗口任意空白处单击右键,在快捷菜单中选择并单击“设置传真”,弹出“正在配置组件”对话框。
第五步:扫描系统后弹出提示窗口,插入Windows XP安装光盘,安装完成可以看到窗口中多了一个“Fax”图标。
第六步:双击“Fax”弹出“传真配置向导”对话框,单击“下一步”(计算机基础知识 )。
第七步:设置发信人信息,如:姓名、传真号码、职务、办公室电话、地址等。发信人姓名和传真号码不可省略,传真号码就是与调制解调器连接的电话号码。设置完成单击“下一步”。
第八步:设置发送或接收传真文件的调制解调器,单击选中“允许发送”、“允许接收”,并根据需要单击选择应答方式。如果选中“自动应答”还要设置应答前响铃次数等。完成设置单击“下一步”。
第九步:在“TSID”和“CSID”文本框中键人发送传真时显示的电话号码,以便对方识别。单击“下一步”。
第十步:设置接收传真后如何处理文件。如果要把收到的传真文件打印出来,单击选中“打印到”,并在列表中选中打印机名称;如果要在计算机中保存一份收到的传真文件副本,单击选中“将副本保存到文件夹”,并通过“浏览”选择保存位置。单击“下一步”,接着单击“完成”,结束配置。
0条评论