编写Windows服务的问题 诸位:请给些参考资料。我怎么觉得很难查到呀!用API和ATL编写服务都可以。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 放飞技术网上有4篇文章,我的blog上有一篇文章。 MSDNhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/service_functions.asp本来想贴例子上来了,但是找起来有些麻烦,只好说一下思路和主要的函数,参考一下MSDN里面的例子吧。首先要注册service OpenSCManager打开service管理器 CreateService创建service CloseServiceHandle关闭service管理器service的主程序 main中调用StartServiceCtrlDispatcher执行service的主函数 service的主函数中 RegisterServiceCtrlHandlerEx注册service控制函数 各个时点调用report(用SetServiceStatus实现)汇报service当前状态 OpenSCManager打开service管理器 OpenService打开service service处理 CloseServiceHandle关闭service CloseServiceHandle关闭service管理器 service控制程序 接受service管理器的信号(主要是停止信号),然后处理 TCHAR szPath[512]; if(!::GetModuleFileName(NULL,szPath,511)) { return FALSE; } BOOL ret=FALSE; SC_HANDLE scm=NULL; SC_HANDLE srv=NULL; scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(scm) { DWORD* pdwTagID=((m_dwServiceType == SERVICE_KERNEL_DRIVER || m_dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) && (m_dwStartType == SERVICE_BOOT_START || m_dwStartType == SERVICE_SYSTEM_START)) ? &m_dwTagID : NULL; srv=::CreateService(scm, m_lpszServiceName, m_lpszDisplayName, m_dwDesiredAccess, //SERVICE_ALL_ACCESS m_dwServiceType, //SERVICE_WIN32_OWN_PROCESS m_dwStartType, //SERVICE_AUTO_START m_dwErrorControl, //SERVICE_ERROR_NORMAL szPath, m_lpszLoadOrderGroup, pdwTagID, m_lpszDependencies, m_lpszStartName, m_lpszPassword); if(srv) { ret=TRUE; ::CloseServiceHandle(srv); } ::CloseServiceHandle(scm); } if(ret) { RegisterApplicationLog( szPath, EVENTLOG_ERROR_TYPE| EVENTLOG_WARNING_TYPE| EVENTLOG_INFORMATION_TYPE); AddToMessageLog(TEXT("服务已经安装"),EVENTLOG_INFORMATION_TYPE); } return ret; MSDN里的CreateService函数有M$的例子,你不会看吗?! 补充一下,只看CreateService函数的例子是不够的。还要看ServiceMain相关系列函数才行 登入界面的问题 请问如何对CList<CPoint, CPoint&> list进行排序? 请教一个简单的sql语句问题 VC7.0的一个特大bug!!! 研究生快毕业了。大家帮我定定毕业论文的题目。 如何改变光盘的默认显示名称? 关于网络流量统计计费的问题,高分相送! VC+ACCESS2000数据库问题? 怎么把dbgrid和自己建的记录集联系起来 能否在Dll中接收windows消息? 请问VC里复合SQL查询怎么用 如何按频率向串口发送数据?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/service_functions.asp本来想贴例子上来了,但是找起来有些麻烦,只好说一下思路和主要的函数,参考一下MSDN里面的例子吧。首先要注册service
OpenSCManager打开service管理器
CreateService创建service
CloseServiceHandle关闭service管理器service的主程序
main中调用StartServiceCtrlDispatcher执行service的主函数
service的主函数中
RegisterServiceCtrlHandlerEx注册service控制函数
各个时点调用report(用SetServiceStatus实现)汇报service当前状态
OpenSCManager打开service管理器
OpenService打开service
service处理
CloseServiceHandle关闭service
CloseServiceHandle关闭service管理器
service控制程序
接受service管理器的信号(主要是停止信号),然后处理
if(!::GetModuleFileName(NULL,szPath,511))
{
return FALSE;
}
BOOL ret=FALSE;
SC_HANDLE scm=NULL;
SC_HANDLE srv=NULL;
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm)
{
DWORD* pdwTagID=((m_dwServiceType == SERVICE_KERNEL_DRIVER ||
m_dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) &&
(m_dwStartType == SERVICE_BOOT_START ||
m_dwStartType == SERVICE_SYSTEM_START)) ?
&m_dwTagID : NULL;
srv=::CreateService(scm,
m_lpszServiceName,
m_lpszDisplayName,
m_dwDesiredAccess, //SERVICE_ALL_ACCESS
m_dwServiceType, //SERVICE_WIN32_OWN_PROCESS
m_dwStartType, //SERVICE_AUTO_START
m_dwErrorControl, //SERVICE_ERROR_NORMAL
szPath,
m_lpszLoadOrderGroup,
pdwTagID,
m_lpszDependencies,
m_lpszStartName,
m_lpszPassword);
if(srv)
{
ret=TRUE;
::CloseServiceHandle(srv);
}
::CloseServiceHandle(scm);
}
if(ret)
{
RegisterApplicationLog( szPath,
EVENTLOG_ERROR_TYPE|
EVENTLOG_WARNING_TYPE|
EVENTLOG_INFORMATION_TYPE);
AddToMessageLog(TEXT("服务已经安装"),EVENTLOG_INFORMATION_TYPE);
}
return ret;