首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个windows服务是否都调用其可执行的主函数?

每个windows服务是否都调用其可执行的主函数?
EN

Stack Overflow用户
提问于 2018-11-24 20:23:18
回答 2查看 1K关注 0票数 1

关于windows服务,我有一个非常基本的问题,我有这个安装main函数,我可以用它来安装我的服务,还有一些配置数据加载在主函数中:

代码语言:javascript
复制
int 
wmain(int argc, WCHAR* argv[])
{
    // it reads config and fill a global struct.
    ReadConfig();

    // if command == 'install'
    install_service();
}

以下是服务的主要功能:

代码语言:javascript
复制
void WINAPI ServiceMain(DWORD argc, WCHAR* argv[])
{
   // this method retrieves the global config object.
   auto config_data = GetConfigData();

   // service stuff
}

下面是在我的wmain函数中调用的另一个函数,如果它不带任何参数(argc =0 !):

代码语言:javascript
复制
bool
ServiceRunAsService()
{
    static const SERVICE_TABLE_ENTRY table[] = {
        { SERVICE_NAME, ServiceMain },
        { NULL, NULL }
    };

    g_hStopService = CreateEvent(0, TRUE, FALSE, 0);
    return StartServiceCtrlDispatcher(table) && GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
}

我的问题是,当windows想运行我的服务(在PC关闭并再次打开之后),它是调用我的wmain函数(从而调用ReadConfig函数)还是调用已注册的ServiceMain函数?我想指出install_service方法,查找GetModuleFileName可执行文件的路径,并将其传递给CreateServiceScmManager

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-24 21:05:10

启动可执行文件时,无论出于什么原因,都会调用exe入口点(如果进程之前没有崩溃或挂起)。因此,在您的情况下,始终是wmainCRTStartup (或者您的exe真正入口点的名称),它调用您的wmain。所以,是的--每次可执行文件启动时都会调用您的wamin

不管怎么说,系统都不能简单地调用ServiceMain。只是不知道它的地址。而且它没有注册。注册exe服务时,可以为服务注册命令行,而不是在exe中注册任何导出的名称。您的可执行文件仅在ServiceMain之后才成为服务并注册StartServiceCtrlDispatcher,必须从wmain调用该服务。

即使在dll表单服务与svchost.exe一起工作的情况下,也可以注册导出函数,这些函数必须从dll作为服务入口点调用,或者默认情况下是ServiceMain。但是无论如何,即使在这种情况下,首先您的DllMain (dll入口点)也将被调用(如果存在)。如果exe入口点是强制性的,并且总是会被调用。

票数 2
EN

Stack Overflow用户

发布于 2018-11-24 21:11:59

当操作系统执行EXE时,它调用EXE的入口点,然后调用代码的(w)main()函数。当作为服务运行时,代码必须调用StartServiceCtrlDispatcher(),它循环处理来自服务控制器的消息并调用ServiceMain()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53462047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档