【问题标题】:StartService with argument带参数的 StartService
【发布时间】:2012-06-11 20:07:53
【问题描述】:

我正在尝试将一个 win32 应用程序转换为服务。我使用 CreateService() 将它的应用程序创建为服务(使用下面的代码)。

    SC_HANDLE schService = CreateService
    ( 
        schSCManager,   /* SCManager database      */ 
        pName,          /* name of service         */ 
        pName,          /* service name to display */ 
        SERVICE_ALL_ACCESS,        /* desired access          */ 
        SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /*service type*/ 
        SERVICE_AUTO_START,      /* start type              */ 
        SERVICE_ERROR_NORMAL,      /* error control type      */ 
        pPath,          /* service's binary        */ 
        NULL,                      /* no load ordering group  */ 
        NULL,                      /* no tag identifier       */ 
        NULL,                      /* no dependencies         */ 
        NULL,                      /* LocalSystem account     */ 
        NULL
    );                     /* no password             */ 

如果实际应用程序中没有参数,我可以启动服务。如果我尝试使用参数启动服务,那么它会产生问题。

LPCTSTR apszSvcArgv[32] = {"start","passwd"};
int nSvcArgc = 2;
if(StartService(schService, nSvcArgc,apszSvcArgv))
{
  return TRUE;
}

我试图在主程序中转储传入的参数,它总是将参数的编号显示为 1。

我做错什么了吗?是否可以将这样的参数传递给 win32 控制台应用程序。

如果我错了请纠正我..提前谢谢

【问题讨论】:

  • 您不能通过调用神奇的CreateService 函数将控制台应用程序作为服务运行。 Windows 服务是特殊类型的应用程序,专门设计为服务。
  • 感谢您的重播。但是我有一些疑问,如果没有参数,我可以使用相同的方法创建和启动服务。创建后,服务名称列在 services.msc 中,启动后,它会在任务管理器中正常显示。埃文我能够访问该服务。我从codeproject.com/Articles/16488/A-Windows-Service-Application得到这个想法
  • 仅仅因为您能够做某事并不意味着这是一个好主意或可以工作。 CreateService 函数实际上并不验证您的可执行文件已被设计为服务,它只是假设您知道自己在做什么。我不知道你为什么怀疑我刚才所说的,很明显你在让这项工作像你期望的那样工作时遇到了问题。原因是服务与典型的应用程序有很大的不同。是的,互联网上有错误的信息。链接文章的第一段表明了对服务的严重误解。
  • 谢谢,你能帮我提供一些链接、步骤或示例,通过这些链接,我可以将我的应用程序转换为 Windows 服务。我有一个用 C 编写的 win32 控制台应用程序

标签: c windows visual-c++


【解决方案1】:

您需要将 args 向量定义为 const char(或 wchar),然后将向量传递给 StartService。

这是一个 VS 中的 unicode 程序示例

const wchar_t *args[] = { L"arg1", L"arg2", L"arg3", L"arg4" };
StartService(schService, 4, args);

【讨论】:

  • 我的问题是,由于第一个参数始终是服务名称,您是在StartService() 提供它还是系统自动添加一个,所以在您的示例中,服务会看到 5 个参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多