c编写windows服务的应用实例
昨天,我研究了一下如何用c编写windows服务,如果有兄弟不知道怎么弄,可以去看一下,因为我昨天晚上研究了它的应用,今天准备和大家分享一下。
昨天的文章在这里:彻底搞懂如何用c编写windows服务
c编写windows服务,这个链接第一次用,不太知道怎么弄。
昨天安装了一个啥也没干的windows服务,我就在想,这个东西能做什么呢?最后我决定制作一个守护程序,功能就是监测另一个程序,看它有没有启动,没有的话就启动它。制作一个简单的程序,我们就来监测它是不是启动了,程序文件名:text。exe。
切换到service的代码视图
整体代码如下,,这里我用LOG文件做了日志:usingSystem;usingSystem。IO;usingSystem。ServiceProcess;usingSystem。Windows。Forms;namespaceAFw{publicpartialclassTheService:ServiceBase{定义一个timerpublicSystem。Timers。TimertimernewSystem。Timers。Timer();运行路径stringthepathApplication。StartupPath;ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件路径stringlogfilelog。txt;被监控程序的进程名,用来检查它是不是已经运行stringjinchengmingtest;被监控程序的文件名stringrunfilenametest。exe;publicTheService(){InitializeComponent();定义timer事件timer。ElapsednewSystem。Timers。ElapsedEventHandler(timerElapsed);timer。Interval1000;时间间隔}timer启动后,每隔一段时间检测下被监视程序是否运行,如果没有就运行它voidtimerElapsed(objectsender,System。Timers。ElapsedEventArgse){根据进程名得到被监测程序的进程对象System。Diagnostics。Process〔〕myprocSystem。Diagnostics。Process。GetProcessesByName(jinchengming);intisrunmyproc。Length;如果没有进程,说明这个程序没有运行if(isrun0){try{Log(程序未运行,准备运行。。。);运行被监控程序System。Diagnostics。Process。Start(thepathrunfilename);Log(程序已经启动。。。);}catch(Exceptionex){Log(启动程序时发现错误:ex。ToString());Application。Exit();}}else{Log(程序正在运行);}}protectedoverridevoidOnStart(string〔〕args){服务启动时的事件,timer开始工作timer。Enabledtrue;timer。Start();Log(服务启动。。。);}protectedoverridevoidOnStop(){服务停止时的事件,timer停止工作timer。Enabledfalse;timer。Stop();Log(服务停止。。。);}voidLog(stringlogcontent)记录ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a{using(FileStreamstnewFileStream(thepathlogfile,FileMode。Append)){using(StreamWriterwrnewStreamWriter(st)){wr。WriteLine(34;{DateTime。Now。ToLongTimeString()},{logcontent});}}}}}出现以下情况
是因为我们写的不是windows窗体服务,添加一下system。windows。Forms。dll,
再引用一下usingSystem。Windows。Forms;就可以了。
重新生成解决方案,因为我程序中都是用的应该程序根目录,这样方便调试,所以这次需要把3个文件放在同一目录下
G:xinstallUtil。exeAFw。exe安装服务,然后启动服务
运行后,test。exe并未弹出
但查看日志文件没有发现问题
查看进程,发现已经有了test进程,杀死后,还会出现这个进程,说明服务程序没有问题。但需要注意的是,此时test进程为后台进程
这是什么原因呢?给服务加上与桌面交互选项也是不行的
查了些资料,确定原因出现在这句:
System。Diagnostics。Process。Start(thepathrunfilename);
我不知道是什么原因,用它启动text。exe就是后台进程,解决方法如下:新建一个文件(我并不知道为啥,这个是网上抄的)
这个文件直接照抄就行了。usingSystem;usingSystem。Runtime。InteropServices;namespaceRFW{publicclassWinAPIInterop{publicstaticIntPtrWTSCURRENTSERVERHANDLEIntPtr。Zero;summary服务程序执行消息提示,前台MessageBox。Showsummaryparamnamemessage消息内容paramparamnametitle标题parampublicstaticvoidShowServiceMessage(stringmessage,stringtitle){intresp0;WTSSendMessage(WTSCURRENTSERVERHANDLE,WTSGetActiveConsoleSessionId(),title,title。Length,message,message。Length,0,0,outresp,false);}〔DllImport(kernel32。dll,SetLastErrortrue)〕publicstaticexternintWTSGetActiveConsoleSessionId();〔DllImport(wtsapi32。dll,SetLastErrortrue)〕publicstaticexternboolWTSSendMessage(IntPtrhServer,intSessionId,StringpTitle,intTitleLength,StringpMessage,intMessageLength,intStyle,intTimeout,outintpResponse,boolbWait);regionPInvokeWTSAPIsprivateenumWTSCONNECTSTATECLASS{WTSActive,WTSConnected,WTSConnectQuery,WTSShadow,WTSDisconnected,WTSIdle,WTSListen,WTSReset,WTSDown,WTSInit}〔StructLayout(LayoutKind。Sequential,CharSetCharSet。Auto)〕privatestructWTSSESSIONINFO{publicUInt32SessionID;publicstringpWinStationName;publicWTSCONNECTSTATECLASSState;}〔DllImport(WTSAPI32。DLL,SetLastErrortrue,CharSetCharSet。Auto)〕staticexternboolWTSEnumerateSessions(IntPtrhServer,〔MarshalAs(UnmanagedType。U4)〕UInt32Reserved,〔MarshalAs(UnmanagedType。U4)〕UInt32Version,refIntPtrppSessionInfo,〔MarshalAs(UnmanagedType。U4)〕refUInt32pSessionInfoCount);〔DllImport(WTSAPI32。DLL,SetLastErrortrue,CharSetCharSet。Auto)〕staticexternvoidWTSFreeMemory(IntPtrpMemory);〔DllImport(WTSAPI32。DLL,SetLastErrortrue,CharSetCharSet。Auto)〕staticexternboolWTSQueryUserToken(UInt32sessionId,outIntPtrToken);endregionregionPInvokeCreateProcessAsUsersummaryStruct,EnumandPInvokeDeclarationsforCreateProcessAsUser。summary〔StructLayout(LayoutKind。Sequential,CharSetCharSet。Auto)〕structSTARTUPINFO{publicInt32cb;publicstringlpReserved;publicstringlpDesktop;publicstringlpTitle;publicInt32dwX;publicInt32dwY;publicInt32dwXSize;publicInt32dwYSize;publicInt32dwXCountChars;publicInt32dwYCountChars;publicInt32dwFillAttribute;publicInt32dwFlags;publicInt16wShowWindow;publicInt16cbReserved2;publicIntPtrlpReserved2;publicIntPtrhStdInput;publicIntPtrhStdOutput;publicIntPtrhStdError;}〔StructLayout(LayoutKind。Sequential,CharSetCharSet。Auto)〕structPROCESSINFORMATION{publicIntPtrhProcess;publicIntPtrhThread;publicintdwProcessId;publicintdwThreadId;}summary以当前登录的windows用户(角色权限)运行指定程序进程summaryparamnamehTokenparamparamnamelpApplicationName指定程序(全路径)paramparamnamelpCommandLine参数paramparamnamelpProcessAttributes进程属性paramparamnamelpThreadAttributes线程属性paramparamnamebInheritHandlesparamparamnamedwCreationFlagsparamparamnamelpEnvironmentparamparamnamelpCurrentDirectoryparamparamnamelpStartupInfo程序启动属性paramparamnamelpProcessInformation最后返回的进程信息paramreturns是否调用成功returns〔DllImport(ADVAPI32。DLL,SetLastErrortrue,CharSetCharSet。Auto)〕staticexternboolCreateProcessAsUser(IntPtrhToken,stringlpApplicationName,stringlpCommandLine,IntPtrlpProcessAttributes,IntPtrlpThreadAttributes,boolbInheritHandles,uintdwCreationFlags,stringlpEnvironment,stringlpCurrentDirectory,refSTARTUPINFOlpStartupInfo,outPROCESSINFORMATIONlpProcessInformation);〔DllImport(KERNEL32。DLL,SetLastErrortrue,CharSetCharSet。Auto)〕staticexternboolCloseHandle(IntPtrhHandle);endregionsummary以当前登录系统的用户角色权限启动指定的进程summaryparamnameChildProcName指定的进程(全路径)parampublicstaticvoidCreateProcess(stringChildProcName){IntPtrppSessionInfoIntPtr。Zero;UInt32SessionCount0;if(WTSEnumerateSessions((IntPtr)WTSCURRENTSERVERHANDLE,CurrentRDSessionHostServerhandlewouldbezero。0,Thisreservedparametermustbezero。1,Theversionoftheenumerationrequestmustbe1。refppSessionInfo,Thiswouldpointtoanarrayofsessioninfo。refSessionCountThiswouldindicatethelengthoftheabovearray。)){for(intnCount0;nCountSessionCount;nCount){WTSSESSIONINFOtSessionInfo(WTSSESSIONINFO)Marshal。PtrToStructure(ppSessionInfonCountMarshal。SizeOf(typeof(WTSSESSIONINFO)),typeof(WTSSESSIONINFO));if(WTSCONNECTSTATECLASS。WTSActivetSessionInfo。State){IntPtrhTokenIntPtr。Zero;if(WTSQueryUserToken(tSessionInfo。SessionID,outhToken)){PROCESSINFORMATIONtProcessInfo;STARTUPINFOtStartUpInfonewSTARTUPINFO();tStartUpInfo。cbMarshal。SizeOf(typeof(STARTUPINFO));boolChildProcStartedCreateProcessAsUser(hToken,Tokenoftheloggedonuser。ChildProcName,Nameoftheprocesstobestarted。null,Anycommandlineargumentstobepassed。IntPtr。Zero,DefaultProcessattributes。IntPtr。Zero,DefaultThreadsattributes。false,DoesNOTinheritparentshandles。0,Noanyspecificcreationflag。null,Defaultenvironmentpath。null,Defaultcurrentdirectory。reftStartUpInfo,ProcessStartupInfo。outtProcessInfoProcessinformationtobereturned。);if(ChildProcStarted){CloseHandle(tProcessInfo。hThread);CloseHandle(tProcessInfo。hProcess);}else{interrMarshal。GetLastWin32Error();ShowServiceMessage(CreateProcessAsUser失败:err。ToString(),CreateProcess);}CloseHandle(hToken);break;}}}WTSFreeMemory(ppSessionInfo);}}}}将打开文件那句改成:try{Log(程序未运行,准备运行。。。);运行被监控程序,下面这句不行System。Diagnostics。Process。Start(thepathrunfilename);用这句才可以打开应用进程RFW。WinAPIInterop。CreateProcess(thepathrunfilename);Log(程序已经启动。。。);}重新安装服务,运行效果如下:
明天再来研究,用其它程序来控制这个服务的安装与卸载
如果看得上的话,需要源码可以联系我。
李嘉诚父子,一把卖出119栋豪宅来源:视觉中国记者钟黛杨松编辑陈晓平李嘉诚家族的买卖,一刻不停歇。在9月最后一周,李家地产旗舰长实集团(01113。HK),股价遭遇重挫,创下半年新低,多轮回……
在北京,压力都是自己给的前几天,公司组织部门聚餐,地点选在了双井附近的一家日料店,聚餐结束后已是晚上九点多,马路两边的各种露天饭馆灯红酒绿,人声湮没在觥筹交错之中,空气里弥漫着烧烤的香味,远处的富力广……
这样的家庭培养出来的孩子容易得抑郁症穷凶极恶的人,没有罪恶感,所以什么坏事都能干得出来,同样伪善的人为了逃避罪恶感,什么邪恶的事都会去干。一定要远离伪善之人,否则它被扼杀你生命中的活力。伪善之人和正常……
几百元的波轮洗衣机,和两三千元的有什么区别?有必要买贵的吗?很多人家里都用上滚筒洗衣机了,还在用波轮洗衣机的家庭并不多,如今还坚持用波轮洗衣机的人,很大的原因是由于波轮洗衣机价格便宜,性价比高,而且操作简单方便,洗衣服也干净,完美诠释了……
乌镇入风口来乌镇,看未来。始于2014年的世界互联网大会,已经走到第九个年头。互联网风起云涌,就如桥下千年流淌的京杭大运河,让千年古镇联通万物。深度覆盖的5G网络、招手即停的无人驾……
英特尔确认CPU及各类芯片涨价,将于2022Q4开始执行新定此前有报道称,英特尔基于能源、原材料和劳动力成本增加等因素,加上已存在供过于求的问题,计划提高其产品的定价,大部分CPU及各类芯片都会受此影响。传闻英特尔会在现有定价基础上增加……
若是场戏同是天涯沦落人,相逢何必曾相识。总在错误年纪错误地方,遇到情投意合的人。而自己的内心却一次次囚禁在过往愚昧而执着的誓言里。虽然曾经那人早已离去,却始终打不开困扰自己多年的枷锁。……
学术前沿袁维堂教授团队在机器人中低位直肠癌保肛手术方面取得新近日,郑州大学第一附属医院直肠肛门外科袁维堂教授团队参与的全国多中心研究机器人对比腹腔镜中低位直肠癌保肛手术(REAL研究)取得新突破,研究成果以题为Roboticversus……
经受多重考验我国如何实现粮食稳产丰收?粮稳天下安。我国的粮食安全,关系着十四亿多人口的吃饭问题。今年,经受住多重考验,我国粮食的稳产丰收来之不易。守住耕地红线去年全国耕地总量净增加今年,我国夏粮、早稻、……
人到了一定年纪,拼的是格局你的能力决定你能得到什么,而你的格局,却会决定你最终能走到哪里。到了一定年纪,要想走得远,一定要修得大格局,能有容人、容言、容事之量。容人古人云:让人三分不吃……
暗黑破坏神不朽德鲁伊的藤蔓,那股画风让我想起了虫族暗黑2的暗金神器到了3都成了硫磺,好气啊!现在2重置版又没希望了,4到底怎么样还是未知数,好在有了官方渠道买2,召唤以前的室友们又在战网走起了。一个boss战打成穷光蛋,老老实……
俄罗斯三套娃缺席!世锦赛成就坂本花织,236。09分夺冠,挥花样滑冰世锦赛今天凌晨继续进行,在缺少了俄罗斯三套娃之后,这次的女单比赛也是缺少了不少的星光,但是作为新科的冬奥会季军,日本队的坂本花织也是成为夺冠的最大热门,而她的表现也是无……