下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC++6开发Windows服务程序VC技术

VC++6开发Windows服务程序VC技术.doc

VC++6开发Windows服务程序VC技术

王霜柏
2017-09-18 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC++6开发Windows服务程序VC技术doc》,可适用于IT/计算机领域

VC开发Windows服务程序VC技术下面介绍使用VC开发Windows服务程序。首先运行VC选择新建工程在出现的下面窗口中选择”ATLCOMAppWizard“并选择工程放置位置和相应的工程名然后选择确定按钮。此时出现如下图窗口界面在此界面中选择”服务(EXE)“然后选择完成按钮。在接下来的窗口中选择确定按钮。则VC完成向导并生成相应代码(效果如下)。程序的进入点是全局函数tWinMain,仔细看一下这个函数,我们会发现当我们运行程序时,可以加上参数,例如:winsvrRegServer或者winsvrRegServer这个是用来本地服务器注册(RegisterasLocalSRegisterasServiceerver)。其中winsvrService或者winsvrService这个是服务的注册(RegisterasService)winsvrUnRegServer或者winsvrUnRegServer这个是服务的删除。所以当我们写好了服务程序只要运行的时候加上参数Service,这个时候在SCM中就会看到我们的服务了。每次编码后测试都要在命令行中加参数运行服务才可以在SCM中列出来这样很麻烦因此可以采用如下方式来处理:选择VCIDE的菜单工程>设置,再选择自定义组建面板(如下图所示)在"$(TargetPath)"RegServer的下面加上:"$(TargetPath)"Service这样当我们每次编码后编译程序就不用再在命令行中去加参数执行我们的服务程序完成服务的注册了。同时通过界面我们也看到向导为我们建立了一个类:CServiceModule全局变量Module就是这个类的实例。Init():这个函数用于完成一些初始化工作Run():这个函数就是服务开始运行后的内容我们接下来要修改的内容也就是从这里入手。Install():有如下一段代码SCHANDLEhService=::CreateService(hSCM,mszServiceName,mszServiceName,SERVICEALLACCESS,SERVICEWINOWNPROCESS,SERVICEDEMANDSTART,SERVICEERRORNORMAL,szFilePath,,,T("RPCSS"),,)注意:如果服务中启动的程序具有窗口(即具有交互功能则要求使用如下代码)SCHANDLEhService=::CreateService(hSCM,mszServiceName,mszServiceName,SERVICEALLACCESS,SERVICEWINSHAREPROCESS|SERVICEINTERACTIVEPROCESS,SERVICEAUTOSTART,SERVICEERRORNORMAL,szFilePath,,,T("RPCSS"),,)这个CreateService函数原先如下:SCHANDLECreateService(SCHANDLEhSCManager,handletoSCMdatabaseLPCTSTRlpServiceName,nameofservicetostartLPCTSTRlpDisplayName,displaynameDWORDdwDesiredAccess,typeofaccesstoserviceDWORDdwServiceType,typeofserviceDWORDdwStartType,whentostartserviceDWORDdwErrorControl,severityofservicefailureLPCTSTRlpBinaryPathName,nameofbinaryfileLPCTSTRlpLoadOrderGroup,nameofloadorderinggroupLPDWORDlpdwTagId,tagidentifierLPCTSTRlpDependencies,arrayofdependencynamesLPCTSTRlpServiceStartName,accountnameLPCTSTRlpPasswordaccountpassword)第六个参数是服务的启动类型。SERVICEDEMANDSTART是手动启动SERVICEAUTOSTART是自动启动。第十一个参数是服务的依存关系比如说服务的启动想要依存SQLServer的启动那我们可以把这个参数写成:T("MSSQLSERVER")如果我们写的服务不依存于其他的任何服务那我们就将此参数设置为就可以了。接下来我们实现我们需要实现的业务。首先我们在类CServiceModule中找到Run函数并在Run函数中找到以下代码:MSGmsgwhile(GetMessage(msg,,,))DispatchMessage(msg)并在此代码前加入自己的代码我这里加入的代码:CustomFunc()。这里对应不同应用有不同写法:、如果要启动一个窗口进行交互则代码如下:定义两个成员函数CustomFunc和CustomFuncvoidCServiceModule::CustomFunc(){TCHARszFilePathMAXPATHGetModuleFileName(,szFilePath,MAXPATH)(tcsrchr(szFilePath,T('')))=删除文件名只获得路径CStringstrurl=szFilePathstrurl=strurl"Bexe"LogEvent("运行程序:"strurl)UINTrtn=WinExec(strurl,SWSHOW)UINTrtn=WinExec("c:windowssystemcmdexe",SWSHOWNORMAL)if(rtn>){LogEvent("调用成功")}else{if(rtn==){LogEvent("内存不足")}else{if(rtn==ERRORBADFORMAT){ERRORBADFORMAT=LogEvent("EXE文件无效")}else{if(rtn==ERRORFILENOTFOUND){ERRORFILENOTFOUND=LogEvent("文件名错误")}else{if(rtn==ERRORPATHNOTFOUND){ERRORPATHNOTFOUND=LogEvent("路径名错误")}else{LogEvent("发生其它错误")}}}}}}BOOLCServiceModule::CustomFunc(){HDESKhdeskCurrentHDESKhdeskHWINSTAhwinstaCurrentHWINSTAhwinstahwinstaCurrent=GetProcessWindowStation()if(hwinstaCurrent==){LogEvent(T("getwindowstationerr"))returnFALSE}hdeskCurrent=GetThreadDesktop(GetCurrentThreadId())if(hdeskCurrent==){LogEvent(T("getwindowdesktoperr"))returnFALSE}打开winstahwinsta=OpenWindowStation("winsta",FALSE,WINSTAACCESSCLIPBOARD|WINSTAACCESSGLOBALATOMS|WINSTACREATEDESKTOP|WINSTAENUMDESKTOPS|WINSTAENUMERATE|WINSTAEXITWINDOWS|WINSTAREADATTRIBUTES|WINSTAREADSCREEN|WINSTAWRITEATTRIBUTES)if(hwinsta==){LogEvent(T("openwindowstationerr"))returnFALSE}if(!SetProcessWindowStation(hwinsta)){LogEvent(T("Setwindowstationerr"))returnFALSE}打开desktophdesk=OpenDesktop("default",,FALSE,DESKTOPCREATEMENU|DESKTOPCREATEWINDOW|DESKTOPENUMERATE|DESKTOPHOOKCONTROL|DESKTOPJOURNALPLAYBACK|DESKTOPJOURNALRECORD|DESKTOPREADOBJECTS|DESKTOPSWITCHDESKTOP|DESKTOPWRITEOBJECTS)if(hdesk==){LogEvent(T("Opendesktoperr"))returnFALSE}SetThreadDesktop(hdesk)CustomFunc()if(!SetProcessWindowStation(hwinstaCurrent))returnFALSEif(!SetThreadDesktop(hdeskCurrent))returnFALSEif(!CloseWindowStation(hwinsta))returnFALSEif(!CloseDesktop(hdesk))returnFALSEreturnTRUE}、无交互窗口则代码如下:voidCServiceModule::CustomFunc(){LogEvent(T("CustormFunctionInvoked"))这里可以改成任何你需要的代码当然不能有显示窗口之内的代码要显示窗口之内代码请采用上面方法。}现在可以编译并执行程序了。此时会编译时会报告一个错误:'CString':undeclaredidentifier。这时需要查看工程的一些设置:菜单工程>设置常规面板默认的设置是:使用MFC作为静态连接库。如果是这个设置则做如下工作:然后我们打开StdAfxh文件并找到#include<atlbaseh>位置并在它之前加入#include<afxh>。重新编译可以了。如果需要修改出现在scm中的服务名可以在工程中找到资源文件中的IDSSERVICENAME项的内容就可以了。注意:编译好了的程序需要在控制台中输入如下指令、注册服务winsvrregserverwinsvrservice此条指令十分重要如果不执行则在scm中是看不到此服务的、注销服务winsvrunregserver

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/8

VC++6开发Windows服务程序VC技术

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利