您的位置:首页 > 其它

编写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,可能就会出现上面的情形了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: