📄 csdn_文档中心_c++学习笔记-后台服务程序开发模式(一).htm
字号:
width=261>
<P align=center class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan"><B><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">类型<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD>
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 190.3pt"
width=254>
<P align=center class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan"><B><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">说明<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 195.75pt"
width=261>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SERVICE_FILE_SYSTEM_DRIVER=2<o:p></o:p></SPAN></P></TD>
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 190.3pt"
width=254>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">文件系统驱动服务。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 195.75pt"
width=261>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SERVICE_KERNEL_DRIVER=1<o:p></o:p></SPAN></P></TD>
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 190.3pt"
width=254>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">驱动服务。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 3">
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 195.75pt"
width=261>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
lang=EN-US
style="BACKGROUND: navy; COLOR: white; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SERVICE_WIN32_OWN_PROCESS=16</SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></SPAN></P></TD>
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 190.3pt"
width=254>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">独占一个进程的服务。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 4; mso-yfti-lastrow: yes">
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 195.75pt"
width=261>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SERVICE_WIN32_SHARE_PROCESS=32<o:p></o:p></SPAN></P></TD>
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: #88c0b8; BORDER-LEFT: #88c0b8; BORDER-RIGHT: #88c0b8; BORDER-TOP: #88c0b8; PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt; WIDTH: 190.3pt"
width=254>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">与其他服务共享一个进程的服务。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR></TBODY></TABLE>
<P><SPAN
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 宋体">新建<SPAN
lang=EN-US>WIN32控制台程序, 其源文件名为service.cpp
。我用的开发工具是VC++.NET。<o:p></o:p></SPAN></SPAN></P>
<P><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 宋体"><o:p> </o:p></SPAN></P>
<P><SPAN lang=EN-US
style="COLOR: red; FONT-FAMILY: 新宋体; FONT-SIZE: 24pt; mso-hansi-font-family: 宋体">1.服务程序主函数<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><SPAN
style="mso-spacerun: yes">
</SPAN>服务控制管理程序启动服务程序后,等待服务程序主函数调用系统函StartServiceCtrlDispatcher。一个SERVICE_WIN32_OWN_PROCESS
类型的服务应该立即调用 StartServiceCtrlDispatcher 函数,可以在服务启动后让服务入口点函数完成初始化工作。对于
SERVICE_WIN32_OWN_PROCESS
类型的服务和程序中所有服务共同的初始化工作可以在主函数中完成,但不要超过30秒。否则必须建立另外的线程完成这些共同的初始化工作,从而保证服务程序主函数能及时地调用
StartServiceCtrlDispatcher 函数。</SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"></SPAN> </P><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; TEXT-INDENT: 22.5pt; mso-char-indent-count: 2.5; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; TEXT-INDENT: 22.5pt; mso-char-indent-count: 2.5; mso-layout-grid-align: none"><SPAN
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">主函数处理了三中命令行参数:<SPAN
lang=EN-US>- install,- remove,-
debug,分别用于安装,删除和调试服务程序。如果不带参数运行,则认为是服务控制管理出现启动该服务程序。参数不正确则给出提示信息。<o:p></o:p></SPAN></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; TEXT-INDENT: 22.5pt; mso-char-indent-count: 2.5; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">StartServiceCtrlDispatcher
函数负责把程序主线程连接到服务控制管理程序。具体描述如下:<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">BOOL
StartServiceCtrlDispatcher(<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><SPAN
style="mso-spacerun: yes"> </SPAN>const LPSERVICE_TABLE_ENTRY
lpServiceTable);<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">lpServiceStartTable
指向 SERVICE_TABLE_ENTRY
结构类型的数组,他包含了调用进程所提供的每个服务的入口函数和字符串名。表中的最后一个元素必须为
NULL,指明入口表结束。SERVICE_TABLE_ENTRY 结构具体描述如下:<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">typedef
struct _SERVICE_TABLE_ENTRY {<SPAN style="mso-spacerun: yes">
</SPAN>LPTSTR lpServiceName;<SPAN style="mso-spacerun: yes">
</SPAN>LPSERVICE_MAIN_FUNCTION lpServiceProc;<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">}
SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -