基于MFC对话框的NT服务程序框架
作者:周星星
感谢[asp12]和[leoyin]的大力帮助,本附件中的程序只是一个没有任何功能的框架程序,程序本身是一个MFC对话框,也是一个NT服务,可以在进入windows之后,用户登陆之前就开始运行。
服务的名称、显示名称、依赖服务 可以在资源中的String Table中修改,分别对应于IDS_SZSERVICENAME、IDS_SZSERVICEDISPLAYNAME、IDS_SZDEPENDENCIES;需要注意的是String Table中不可以存放空字符串,所以在没有依赖服务的情况下,我在IDS_SZDEPENDENCIES中放了一个空格;
注册服务和卸载服务只需要在运行时加上命令行参数 -install 和 -remove;为了便于调试,附加了一个参数 -debug,可以不经由NT服务管理器而启动。有关于NT服务的代码皆来自于MSDN。
对于非MFC的对话框程序而言,可以简化很多代码;MFC对话框比non-MFC对话框多处理了一个WM_ENDSESSION消息,否则用户在注销并重新登陆之后,程序将失去响应。这是本程序的重点所在。
在程序开始处使用了SetCurrentDirectory将当前目录设置为了模块所在目录,否则当前目录就是NT服务管理器所在目录,所以调试的时候需要注意,当前目录不是工程所在目录了,而是工程目录下Debug目录,这非常方便。
本程序还增加了系统托盘功能,对于系统托盘,本程序处理了两个特殊情况,一个是系统托盘弹出的菜单在失去焦点时会自动消失,另一个是在Explorer.exe崩溃重建时系统托盘也自动重建。
使用-debug参数运行时跟普通程序一样,省略;运行和停止这个服务可以在NT服务管理器中进行,也可以使用控制台命令net shart/stop,如果你愿意增加一些代码,也可以直接启动。停止这个服务还可以使用系统托盘中的Exit菜单。
NT服务常用于无人职守运行,因此也应该避免用户不小心退出程序,所以本人将最小化按钮和关闭按钮的功能变成了隐藏,恢复显示和退出程序可以使用系统托盘中的菜单。
对于不熟悉NT服务的用户需要注意,因为NT服务会在用户登陆之前就开始运行,因此比如连接远程共享就应该如下处理:
1.将网络通讯的服务名称加到IDS_SZDEPENDENCIES中,这样确保网络通讯服务在次服务之前启动;
2.因为用户还没有登陆,所以没有默认的用户名,所以应该提供用户名和密码去访问远程共享。 当然这些都不是本程序应该说明的事。
很多文章说到要在NT服务程序中显示界面,必须要OpenWindowStation(_T("winsta0")...),但本人没有这样做,这是一个疑问。
最后,为了避免法律纠纷,特此声明:本代码是在业余时间编写,虽曾用于部分商业项目,但所有权不属于任何公司,而本人也不需要任何所有权。
测试平台:win2k pro,VC++6.0 + SP5
最新评论 [发表评论] [文章投稿] 查看所有评论 推荐给好友 打印
请问:在BOOL CT01App::InitInstance()中有一个
main( __argc, __argv );
那么__argc和__argv 从何而来? ( StevieWang 发表于 2005-5-12 12:36:00)
为什么我在在调用StartServiceCtrlDispatcher这个函数的时候老是出错!
0x00000427 服务进程无法连接到服务控制器上。
其他自己写的服务程序也是在这个函数那里出错
( kuibobo 发表于 2004-6-17 0:09:00)
if (schService!=NULL)
{
QueryServiceStatus(schService,&ssStatus);
if (ssStatus.dwCurrentState==SERVICE_RUNNING)
// try to stop the service
if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) )
{
_tprintf(TEXT("Stopping %s."), TEXT(SZSERVICEDISPLAYNAME));
Sleep( 1000 );
( oakdream 发表于 2004-4-22 21:10:00)
schService=OpenService(schSCManager,TEXT(SZSERVICENAME),SERVICE_STOP|SERVICE_QUERY_STATUS); ( oakdream 发表于 2004-4-22 15:48:00)
VOID CmdStopService( )
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
TCHAR szPath[512];
if ( GetModuleFileName( NULL, szPath, 512 ) == 0 ){
_tprintf(TEXT("Unable to install %s - %s\n"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256));
return;
}
schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager!=NULL){
( oakdream 发表于 2004-4-22 15:44:00)
才看到,顶 :-)
( oshj 发表于 2004-4-19 8:29:00)
to YuHao:非常感谢,确实是可以的,可能是我当时测试时不小心,再次深表感谢! ( 周星星 发表于 2004-4-16 13:53:00)
SetProcessWindowStation(hwinsta); hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
SetThreadDesktop(hdesk);
CT01Dlg dlg;
// theApp.m_pMainWnd = &dlg;
dlg.DoModal();
SetProcessWindowStation(hwinstaCurrent));
SetThreadDesktop(hdeskCurrent);
CloseWindowStation(hwinsta);
CloseDesktop(hdesk);
}
( YuHao 发表于 2004-4-16 13:16:00)
你真的试过吗?我把你的程序改了一下,结果还是能出来。
把SERVICE_INTERACTIVE_PROCESS去掉;启动函数如下
VOID ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
{
ReportStatusToSCMgr( SERVICE_RUNNING, NO_ERROR, 0 );
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
( YuHao 发表于 2004-4-16 13:16:00)
to All:在ServiceStop函数中我直接根据对话框句柄调用EndDialog去关闭对话框这是一个不好的做法。因为服务退出所在线程与对话框所在线程不是同一个线程,如果对话框中含有不能跨线程使用的对象,这将是一个麻烦,所以我觉得还是使用消息去通知对话框关闭比较好。 ( 周星星 发表于 2004-4-16 8:35:00)
转载请注明来源:
开源盛世-源代码下载网
http://www.vscodes.com
没有合适的资源?快使用搜索试试~ 我知道了~
fipe.rar_recallmgs
共18个文件
cpp:4个
h:4个
ico:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 3 浏览量
2022-09-21
00:29:31
上传
评论
收藏 34KB RAR 举报
温馨提示
使用参数运行时跟普通程序一样,运行和停止这个服务可以在NT服务管理器中进行
资源推荐
资源详情
资源评论
收起资源包目录
fipe.rar (18个子文件)
T01.cpp 3KB
T01.dsp 4KB
jResource.h 899B
T01.rc 5KB
T01Dlg.h 1KB
T01.clw 880B
T01.APS 35KB
T01Dlg.cpp 5KB
T01.dsw 529B
T01.h 1KB
T01.ico 1KB
A44SERVICE.CPP 17KB
T01.rc2 395B
StdAfx.cpp 205B
stopping.ico 318B
T01.opt 78KB
StdAfx.h 1020B
63ReadMe.txt 5KB
共 18 条
- 1
资源评论
weixin_42653672
- 粉丝: 93
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功