心得一 :核心对象的引用计数
Windows系统中核心对象,比如窗口句柄,文件句柄,Event等等,在Windows的内部管理机制中全部采用引用计数方式管理,比如hService = CreateService(..),经过这次调用,系统中hService这个对象的的引用计数加1,而创建后如果不关闭再次通过OpenSCManager和OpenService打开的犹豫上次的服务句柄没有关闭,再次从服务配置管理数据库中取出的该Service的句柄将发生变化,虽然可以被DeleteServcie删除,但删除后,在控制面板中查询到,当前状态为“已禁用”。必须等待控制工具退出后,该服务才从控制面板的“服务”中消失。至于具体原因,目前未知,也未相通,但觉得和CreateService后没有关闭句柄的引用有关。
心得二 :关于StartServiceCtrlDispatcher
它的原始定义:BOOL StartServiceCtrlDispatcher( const LPSERVICE_TABLE_ENTRY lpServiceTable);请参看关于lpServiceTable的原始定义:
lpServiceTable这个参数指明的是一组指向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,可能就会出现上面的情形了。