标题:程序能把自己加入服务吗
只看楼主
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
已结贴  问题点数:20 回复次数:6 
程序能把自己加入服务吗
参考Windows API 编程,把程序1加入服务是通过程序2来执行的。用什么方法可以把自身加入服务?
搜索更多相关主题的帖子: Windows 
2016-08-19 11:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
当然能啦,将“将某程序注册为NT服务”的功能块放在其程序中和放在另一个程序中有什么区别?
事实上,绝大部分人也是将之做在同一个程序中的,一般通过运行参数来执行不能的功能
比如 参数带-install就是注册,带-uninstall就是反注册,不带参数就是系统在启动这个服务
2016-08-19 12:12
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
没法带参数 --- 怎么个没法呢?你是不是不会用控制台?
服务输出都看不见 --- 你之前分开独立注册时可以显示吗?如果也不可以,那就说明和“独立/整合”没关系,不要混在一起问。NT服务默认是无桌面系统的,你让它显示到哪里呢?解决方法是要么注册时属性中设定此服务有桌面交互,要么代码中用OpenDesktop打开桌面,要么调试时不走NT服务这条路。

你还是在网上找个现有的源代码改改吧。
一般main函数是
if( 参数是 -intall )
    注册此服务
else if( 参数是 -remove )
    删除此服务
else if( 参数是 -debug )
    功能块不走NT服务,而是当成普通程序看待,用于调试
else // 此时应该是系统主动启动服务了
    StartServiceCtrlDispatcher启动服务吧
2016-08-23 08:54
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
得分:0 
回复 4楼 rjsp
谢谢。
有一点没弄明白,就是功能块不走NT服务。不是应该服务的内容都是要通过StartServiceCtrlDispatcher函数启动ServiceMain函数吗?
2016-08-31 09:18
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用lyl930130在2016-8-31 09:18:15的发言:

不是应该服务的内容都是要通过StartServiceCtrlDispatcher函数启动ServiceMain函数吗?
听不懂你说什么,不知道这个“应该”是什么意思,你还是去网上找个源代码框架改改吧。
2016-08-31 10:31
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
得分:0 
回复 6楼 rjsp
解决了,谢谢
2016-09-01 22:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-468021-1-1.html




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

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