关于windows服务,我有一个非常基本的问题,我有这个安装main函数,我可以用它来安装我的服务,还有一些配置数据加载在主函数中:
int
wmain(int argc, WCHAR* argv[])
{
// it reads config and fill a global struct.
ReadConfig();
// if command == 'install'
install_service();
}以下是服务的主要功能:
void WINAPI ServiceMain(DWORD argc, WCHAR* argv[])
{
// this method retrieves the global config object.
auto config_data = GetConfigData();
// service stuff
}下面是在我的wmain函数中调用的另一个函数,如果它不带任何参数(argc =0 !):
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可执行文件的路径,并将其传递给CreateService和ScmManager
发布于 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入口点是强制性的,并且总是会被调用。
发布于 2018-11-24 21:11:59
当操作系统执行EXE时,它调用EXE的入口点,然后调用代码的(w)main()函数。当作为服务运行时,代码必须调用StartServiceCtrlDispatcher(),它循环处理来自服务控制器的消息并调用ServiceMain()。
https://stackoverflow.com/questions/53462047
复制相似问题