我正在使用
mingw
开发一个双赢服务,我已经尝试了几个小时了
我在互联网上查找了我使用的示例ChatGPT
它返回的任何内容都不起作用,我发现了几个例子
与我想要的无关
我希望有某种方法可以做到这一点 想法,在创建
SERVICE_TABLE_ENTRY
之前,我可以检查我的可执行文件是否已启动
对于 Windows 服务,
如果是的话我创建
SERVICE_TABLE_ENTRY
如果我不做任何其他事情的话。
如果您的程序支持多种模式,那么我建议使用像
/service
这样的命令行参数来进行服务注册。
或者,您可以检查您的进程令牌是否包含
S-1-5-6
(SECURITY_SERVICE_RID),但我不确定引入的是哪个 Windows 版本。
如果您想检查它是否正在运行,您应该检查该服务是否正在运行。通过运行
services.msc
并查找您注册的服务来检查服务。
前段时间我写了一个简单的库来使你的程序成为服务(在 Windows 上)或守护进程(在 *nix 上): https://sourceforge.net/projects/daemonservice/
也许你可以检查源代码,了解它是如何完成的......
我看到了一种简单的方法来检查它,只需创建
SERVICE_TABLE_ENTRY
并使用 StartServiceCtrlDispatcher
如果它返回错误,则可能可执行文件像普通程序一样启动。
SERVICE_TABLE_ENTRY _dispatcher_entry_table[] =
{
{"", (LPSERVICE_MAIN_FUNCTION)serviceMain},
{NULL, NULL}
};
if (!StartServiceCtrlDispatcher(_dispatcher_entry_table))
{
DWORD __error_code = GetLastError();
if (__error_code == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
{
//It's probably a normal program
}
else
{
//handle the errors
}
}
有点晚了,但这对我来说可以区分 service.exe 或 cmd.exe 的调用:
static bool AreWeAService()
{ BOOL bIsAService = false;
BYTE sidService[SECURITY_MAX_SID_SIZE] = { 0 };
DWORD cbSidSize = SECURITY_MAX_SID_SIZE;
/* Create a SID for the Windows Service Group (S‒1‒5‒6) and check it against ours */
if (TRUE == ::CreateWellKnownSid(WinServiceSid, nullptr, &sidService, &cbSidSize))
::CheckTokenMembership(NULL, &sidService, &bIsAService);
return bIsAService;
}
将 SID 块分配为 SECURITY_MAX_SID_SIZE 非常重要,否则 CheckTokenMembership API 调用将失败并出现“无效参数”错误。