编写Windows服务应该注意的一些心得
2005-03-30 20:11
567 查看
心得一 :核心对象的引用计数
Windows系统中核心对象,比如窗口句柄,文件句柄,Event等等,在Windows的内部管理机制中全部采用引用计数方式管理,比如hService = CreateService(..),经过这次调用,系统中hService这个对象的的引用计数加1,而创建后如果不关闭再次通过OpenSCManager和OpenService打开的犹豫上次的服务句柄没有关闭,再次从服务配置管理数据库中取出的该Service的句柄将发生变化,虽然可以被DeleteServcie删除,但删除后,在控制面板中查询到,当前状态为“已禁用”。必须等待控制工具退出后,该服务才从控制面板的“服务”中消失。至于具体原因,目前未知,也未相通,但觉得和CreateService后没有关闭句柄的引用有关。
心得二 :关于StartServiceCtrlDispatcher
它的原始定义:BOOL StartServiceCtrlDispatcher( const LPSERVICE_TABLE_ENTRY lpServiceTable);请参看关于lpServiceTable的原始定义:
lpServiceTable [in] Pointer to an array of SERVICE_TABLE_ENTRY structures containing one entry for each service that can execute in the calling process. The members of the last entry in the table must have NULL values to designate the end of the table.这个参数指明的是一组指向SERVICE_TABLE_ENTRY的结构,一组意味着不可以如下传递
SERVICE_TABLE_ENTRY ste;
StartServiceCtrlDispatcher(&ste);
这样传递如果运气好,也许会服务加载成功,但如果运气不好,就会有“等待 Win32 Service that help Vise administrtor to control its functions 服务的连接超时(30000 毫秒)。”“由于下列错误,Win32 Service that help Vise administrtor to control its functions 服务启动失败:服务没有及时响应启动或控制请求。 ”等问题出现,可能还会出现有如上面心得中出现的“已禁用”。因为“Pointer to an array ”“The members of the last entry in the table must have NULL values to designate the end of the table.”两句指明,数组的最后一个这个结构,必须以NULL结尾。至于内部实现虽然不知道,但如果出现连续非NULL,可能就会出现上面的情形了。
Windows系统中核心对象,比如窗口句柄,文件句柄,Event等等,在Windows的内部管理机制中全部采用引用计数方式管理,比如hService = CreateService(..),经过这次调用,系统中hService这个对象的的引用计数加1,而创建后如果不关闭再次通过OpenSCManager和OpenService打开的犹豫上次的服务句柄没有关闭,再次从服务配置管理数据库中取出的该Service的句柄将发生变化,虽然可以被DeleteServcie删除,但删除后,在控制面板中查询到,当前状态为“已禁用”。必须等待控制工具退出后,该服务才从控制面板的“服务”中消失。至于具体原因,目前未知,也未相通,但觉得和CreateService后没有关闭句柄的引用有关。
心得二 :关于StartServiceCtrlDispatcher
它的原始定义:BOOL StartServiceCtrlDispatcher( const LPSERVICE_TABLE_ENTRY lpServiceTable);请参看关于lpServiceTable的原始定义:
lpServiceTable [in] Pointer to an array of SERVICE_TABLE_ENTRY structures containing one entry for each service that can execute in the calling process. The members of the last entry in the table must have NULL values to designate the end of the table.这个参数指明的是一组指向SERVICE_TABLE_ENTRY的结构,一组意味着不可以如下传递
SERVICE_TABLE_ENTRY ste;
StartServiceCtrlDispatcher(&ste);
这样传递如果运气好,也许会服务加载成功,但如果运气不好,就会有“等待 Win32 Service that help Vise administrtor to control its functions 服务的连接超时(30000 毫秒)。”“由于下列错误,Win32 Service that help Vise administrtor to control its functions 服务启动失败:服务没有及时响应启动或控制请求。 ”等问题出现,可能还会出现有如上面心得中出现的“已禁用”。因为“Pointer to an array ”“The members of the last entry in the table must have NULL values to designate the end of the table.”两句指明,数组的最后一个这个结构,必须以NULL结尾。至于内部实现虽然不知道,但如果出现连续非NULL,可能就会出现上面的情形了。
相关文章推荐
- 一个windows服务程序的编写过程及心得(更新中)
- 编写windows服务中调用activeX控件(SDK)的心得
- windows平台上编写动态链接库应该注意的事情
- 编写代码时应该注意的一些地方
- 在编写SQL语句时应该注意的一些小问题;
- 使用codeblocks(WINDOWS7下)编写WIN32 GUI应用程序时一些注意事项
- 如何写一个windows服务?参考win sys program 13章,补充一些书中遗漏的注意点
- 做网站网页编写时应该注意的一些规范
- VS编写 windowsService 服务的注意事项
- C#Windows服务:一些方法(启动、停止等)
- 做程序猿的老婆应该注意的一些事情
- 编写Windows服务程序的五个步骤
- 编写一个C#Windows服务程序,定时从数据库中拿出记录发送邮件。
- 关于PHP使用redis服务的一些基本使用心得
- Windows服务编写原理及探讨【3】
- 前不久,微软发布了其网络硬盘的正式版本:Windows Live Skydrive。它面向公共用户免费提供5G空间,最大单个文件支持到50M,还提供个人文件夹。微软的东西,当然会让人更放心一些,而且最重要的是它提供永久存储服务,还提供超链接!
- 用 VC++ 2008 编写 Windows Service(系统服务)
- C# 编写服务 Windows service
- C# 编写Windows Service(windows服务程序)
- Python编码时应该注意的一些事情