在以下示例中,服务配置程序使用ChangeServiceConfig功能更改已安装服务的配置参数。程序首先尝试锁定数据库,以防止SCM在重新配置时启动服务。如果成功锁定数据库,程序将打开一个服务对象的句柄,修改其配置,解锁数据库,然后关闭服务对象句柄。如果程序没有成功锁定数据库,它将使用QueryServiceLockStatus函数来检索有关该锁的信息。
VOID ReconfigureSampleService(BOOL fDisable)
{
SC_LOCK sclLock;
LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;
DWORD dwBytesNeeded, dwStartType;
//重新配置之前需要获取数据库锁。
sclLock = LockServiceDatabase(schSCManager);
//如果数据库无法锁定,请报告详细信息。
if (sclLock == NULL)
{
//如果数据库没有被其他进程锁定,则退出。
if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
MyErrorExit("LockServiceDatabase");
//分配缓冲区以获取有关锁的详细信息。
lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(
LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256);
if (lpqslsBuf == NULL)
MyErrorExit("LocalAlloc");
//获取并打印锁定状态信息。
if(!QueryServiceLockStatus(
schSCManager,
lpqslsBuf,
sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
& dwBytesNeeded))
MyErrorExit("QueryServiceLockStatus");
if(lpqslsBuf- > fIsLocked)
printf(“Locked by:%s,duration:%d seconds \\ n”,
lpqslsBuf->lpLockOwner,
lpqslsBuf->dwLockDuration);
其他
printf("No longer locked\n");
LocalFree(lpqslsBuf);
MyErrorExit("Could not lock database");
}
//数据库被锁定,所以进行更改是安全的。
//打开服务的句柄。
schService = OpenService(
schSCManager, // SCManager数据库
TEXT("Sample_Srv"), //服务名称
SERVICE_CHANGE_CONFIG); //需要CHANGE访问
if (schService == NULL)
MyErrorExit("OpenService");
dwStartType = (fDisable) ? SERVICE_DISABLED :
SERVICE_DEMAND_START;
if(!ChangeServiceConfig
schService, //处理服务
SERVICE_NO_CHANGE, //服务类型:不变
dwStartType, //更改服务启动类型
SERVICE_NO_CHANGE, //错误控制:没有变化
NULL, // binary path:no change
NULL, //加载订单组:不改变
NULL, // tag ID:no change
NULL, //依赖关系:没有变化
NULL, //帐号:没有变化
NULL) ) //密码:没有变化
{
MyErrorExit("ChangeServiceConfig");
}
其他
printf("ChangeServiceConfig SUCCESS\n");
//释放数据库锁。
UnlockServiceDatabase(sclLock);
//关闭服务的句柄。
CloseServiceHandle(schService);
}