c++ - 每个 Windows 服务都调用其可执行的 main 函数吗?
问题描述
我有一个关于 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
解决方案
当可执行文件启动时,无论出于什么原因,都会调用 exe 入口点(如果进程之前没有崩溃或挂钩)。所以在你的情况下总是wmainCRTStartup
(或者你的 exe 真正入口点的名称是什么)调用你的wmain
. 所以是的 -wamin
每次您的可执行文件启动时都会调用您。
而且系统根本不能随便调用ServiceMain
。它根本不知道它的地址。它没有注册。当您注册 exe 服务时,您会为您的服务注册命令行,但不会在 exe 中注册任何导出的名称。您的可执行文件ServiceMain
仅在之后才成为服务和注册StartServiceCtrlDispatcher
,必须从您的wmain
即使在使用 dll 表单服务的情况下svchost.exe
- 您注册必须从您的 dll 调用的导出函数作为服务入口点,或者ServiceMain
默认情况下。但无论如何,即使在这种情况下,首先你的DllMain
(dll入口点)将被调用(如果存在)。如果 exe - 入口点是强制性的,并且总是会被调用
推荐阅读
- python - 我正在尝试根据包含其所有键的列表提取字典的值,但出现“不可散列类型:'list'”错误
- elasticsearch - 如何使用弹性搜索 7 在结果中内联返回突出显示标签
- postgresql - PostgreSQL 并发行更新
- sql - sql脚本使用datepart每小时分组并用0填充空
- javascript - 在自动完成建议选择上触发加载
- spring-boot - 覆盖自定义 spring-boot-starter 中定义的属性不起作用
- security - 在前端通道中进行授权代码 URI 重定向是一个坏主意吗?
- ruby-on-rails - Ruby Rails 在控制器中模拟 Devise authed 用户
- r - RiskPortfolio 包 最佳投资组合结果
- entity-framework - Last 和 LastOrDefault 的 EF 行为