EasyDarwin

面向企业级的流媒体平台框架

EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。

详细 >>

Windows系统服务程序读取配置文件方法


最近做DSS开发,临近尾声,准备将DSS以服务的形式部署于目标机器中,但读取配置文件这等小事却也有时候会颇费时间,主要目的是让服务程序读取服务可执行文件同目录中的配置...

最近做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路径下,通常我们不会把配置文件放这的,所以就按照我上述的方法,先找到服务,再根据服务信息找到可执行程序的路径,再在相同路径下找到配置文件,希望能够帮助大家应用到其他方面.



------------------------------ 分割线 ------------------------------
本站文章除注明转载外,均为本站原创或编辑,欢迎大家转载,但请务必注明出处,尊重他人成果,谢谢。
转载请注明:EasyDarwin;非本站文章均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。
文章中如果有错误可联系:johnson@easydarwin.org
推荐文章
H.265技术经过2年发展,我们认为H.265高清监......>
近年来,4K超高清、H.265编码技术、视频智能......>
随着科技的发展速度,医疗行业的信息化建设......>
商场里的监控视频除了防盗,还可以做什么呢......>
家用网络摄像机则通过自身的功能帮助消费者......>
最近更新
监控行业正在发生改变,摄像头的数量在增加......>
视频编码技术是对前端摄像机采集过来的数字......>
随着网络的不断发展和应用需求的多样化,对......>
太阳能监控既从早期的贵族金字塔走向了实用......>
随着监控技术的不断发展,已经有越来越多的......>
友情链接 | 申请链接
EasyDarwin官方微信!