| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1481 人关注过本帖
标题:程序能把自己加入服务吗
取消只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:3 
程序能把自己加入服务吗
参考Windows API 编程,把程序1加入服务是通过程序2来执行的。用什么方法可以把自身加入服务?
搜索更多相关主题的帖子: Windows 
2016-08-19 11:08
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 rjsp
谢谢。

以下是改动后的程序结构。
程序代码:
int main(int argc,char *argv[])
{
    if(argc<2)
        main_2();
    else
        main_1();
    system("pause");
    return 0;
}

void main_1( ) 
{ 
    // 设置SERVICE_TABLE_ENTRY 数据结构,以NULL 结构结束,
    // 作为StartServiceCtrlDispatcher 函数的参数。
    SERVICE_TABLE_ENTRY   DispatchTable[] = 
    { 
        { "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart }, 
        { NULL, NULL } 
    }; 
    if (!StartServiceCtrlDispatcher( DispatchTable)) 
    { 
        SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)\n", 
            GetLastError()); 
    } 
} 

void main_2(  ) 
{
    TCHAR szBinFilePath[MAX_PATH];
    PTCHAR pTemp;
    DWORD dwStopError;
    // 构造服务可执行程序的路径
    GetModuleFileName(NULL,szBinFilePath,MAX_PATH);
    pTemp = szBinFilePath+lstrlen(szBinFilePath);

    // 打开 SCM
    schSCManager = OpenSCManager( 
        NULL,                    // local machine 
        NULL,                    // ServicesActive database 
        SC_MANAGER_ALL_ACCESS);  // full access rights 

    if (NULL == schSCManager) 
        printf("OpenSCManager failed (%d)\n", GetLastError());

    // 创建服务
    CreateSampleService(schSCManager, szBinFilePath, szServiceName);
    // 启动服务
    StartSampleService(schSCManager,szServiceName);
    // 发送请求控制
    ControlSampleService(SERVICE_CONTROL_INTERROGATE);
    ControlSampleService(SERVICE_CONTROL_CONTINUE);
    // 停止服务
    dwStopError = StopService( schSCManager, szServiceName, 
        TRUE, 1000);

    if(ERROR_SUCCESS == dwStopError)
    {
        printf("Service Stoped\n"); 
    } 
    else
    {
        printf("Service stoped error (%u)\n",dwStopError); 
    }
    // 删除服务
    DeleteSampleService(szServiceName);
    CloseServiceHandle(schSCManager); 
}


但是发现main_2()中的CreateService()在加载自己本身作为服务程序启动的时候,没法带参数。不知道怎么解决。
而且服务输出都看不见,不知道如何调试。
2016-08-22 23:54
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 4楼 rjsp
谢谢。
有一点没弄明白,就是功能块不走NT服务。不是应该服务的内容都是要通过StartServiceCtrlDispatcher函数启动ServiceMain函数吗?
2016-08-31 09:18
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6楼 rjsp
解决了,谢谢
2016-09-01 22:34
快速回复:程序能把自己加入服务吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056837 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved