我创建了一个应该作为服务和应用程序运行的 win32 应用程序。
当我单击并运行它时,它应该作为应用程序运行。当从服务 Controller 调用时,它应该检测到它并分支以作为服务运行。如何在不传递参数的情况下检测到这一点?
阿布扎德先生
最佳答案
传统(也是最简单的)方法是调用 StartServiceCtrlDispatcher(),如果失败,则假定您没有作为服务运行。这在实践中效果很好,尽管从技术上讲,我不相信微软保证它会这样做。
如果你想要一个更健壮的方法,你可以 examine your security token 看看它是否包含 Service SID ,S-1-5-6。但是,为了使其工作,您必须确保使用 non-zero SID type 配置服务,即使用 SERVICE_SID_TYPE_UNRESTRICTED
或 SERVICE_SID_TYPE_RESTRICTED
。
注意:我正在尝试回答所写的问题,但更好的解决方案是设置一个命令行参数,如评论中所述。您可以在 CreateService() 的 lpBinaryPathName
参数中包含命令行参数。您的 main() 函数将以与普通命令行应用程序相同的方式接收这些参数。
关于c - 如何检测进程是否安装为服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33023625/