• Windows服务中读取配置文件的方法



    最近做DSS开发,临近尾声,准备将DSS以服务的形式部署于目标机器中,但读取配置文件这等小事却也有时候会颇费时间,主要目的是让服务程序读取服务可执行文件同目录中的配置文件,基于前人代码基础上,适用于DSS服务,闲话少说,直接贴代码:

    	bool bPathGet = false;
    	char theConfigFilePath[MAX_PATH] = {0};
    	char theXMLFilePath[MAX_PATH] = {0};
        
    #ifdef WIN32   //适用于Win32服务程序
    	SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //打开系统服务控制器
    	if(SCMan == NULL)
    	{
    		printf("OpenSCManager Error\n");
    		return -1;
    	}
    	LPENUM_SERVICE_STATUS service_status; //保存系统服务的结构
    	DWORD cbBytesNeeded = NULL; 
    	DWORD ServicesReturned = NULL;
    	DWORD ResumeHandle = NULL;
    	
    	service_status = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, 1024 * 64);//分配内存,注意大小
    	
    	//获取系统服务的简单信息
    	bool ESS = EnumServicesStatus(SCMan, //系统服务句柄
    		SERVICE_WIN32, //服务的类型
    		SERVICE_STATE_ALL,  //服务的状态
    		(LPENUM_SERVICE_STATUS)service_status,  //输出参数,系统服务的结构
    		1024 * 64,  // 结构的大小
    		&cbBytesNeeded, //输出参数,接收返回所需的服务
    		&ServicesReturned, //输出参数,接收返回服务的数量
    		&ResumeHandle); //输入输出参数,第一次调用必须为0,返回为0代表成功
    	if(ESS == NULL) 
    	{
    		printf("EnumServicesStatus Error\n");
    		return -1;
    	}
    
    	for(int i = 0; i < ServicesReturned; i++)
    	{
    		if(::strcmp("StreamingServer",service_status[i].lpServiceName) != 0)//注意!服务名称为"StreamingServer"
    			continue;
    
    		LPQUERY_SERVICE_CONFIG lpServiceConfig = NULL;	//服务详细信息结构
    		SC_HANDLE service_curren = NULL;				//当前的服务句柄
    		service_curren = OpenService(SCMan, service_status[i].lpServiceName, SERVICE_QUERY_CONFIG); //打开当前服务
    		lpServiceConfig = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 8 * 1024);      //分配内存, 最大为8kb 
    		
    		if(NULL == QueryServiceConfig(service_curren, lpServiceConfig, 8 * 1024, &ResumeHandle))
    		{
    			printf("QueryServiceConfig Error\n");
    			return -1;
    		}
    
    		//char szFullPath[MAX_PATH] = {0};
    		//::GetModuleFileName(NULL,szFullPath,MAX_PATH);
    		char szDriver[MAX_PATH] = {0};
    		char szFileName[MAX_PATH] = {0};
    		char szDir[MAX_PATH] = {0};
    		::_splitpath(lpServiceConfig->lpBinaryPathName, szDriver, szDir, szFileName,NULL);
    
    
    		sprintf(theConfigFilePath, "%s%s%s",szDriver,szDir,"streamingserver.cfg");
    		sprintf(theXMLFilePath,"%s%s%s",szDriver,szDir,"streamingserver.ini");
    		bPathGet = true;
    		
    		CloseServiceHandle(service_curren);	
    		break;					//关闭当前服务的句柄
    	}
    	CloseServiceHandle(SCMan);//关闭服务管理器的句柄
    #endif
    
    	if(!bPathGet)
    	{
    		sprintf(theConfigFilePath, "%s","streamingserver.cfg");
    		sprintf(theXMLFilePath,"%s","streamingserver.ini");
    
    	}

    很简单的一个点,windows服务程序读取相对路径,其./ home路径在 <System>/Windows/system32路径,所以当我们读取./xxx.ini时,读取到的路径在system32路径下,通常我们不会把配置文件放这的,所以就按照我上述的方法,先找到服务,再根据服务信息找到可执行程序的路径,再在相同路径下找到配置文件,希望能够帮助大家应用到其他方面.


    ------------------------------------------------------------
    本文转自www.easydarwin.org,更多开源流媒体解决方案,请关注我们的微信:EasyDarwin 
     

  • 相关阅读:
    SecureCRT上传文件到服务器 CentOS举例
    MongoDB关于replSet的配置概述(一主二从)
    MongoDB的安装与卸载与再安装……
    zip在python中的使用方法
    try,raise等的python的使用方法介绍
    【转】jQuery给动态添加的元素绑定事件的方法
    sublime的纵向操作(列操作)原来这么用
    Python 利用*args和**kwargs解决函数遇到不确定数量参数问题
    Python 函数式编程介绍
    Python list可以做什么
  • 原文地址:https://www.cnblogs.com/babosa/p/5904726.html
Copyright © 2020-2023  润新知