【问题标题】:C++/CLI Service, run as console app during DebugC++/CLI 服务,在调试期间作为控制台应用程序运行
【发布时间】:2011-09-19 16:55:13
【问题描述】:

我正在尝试构建一个新的 Windows 服务,我可以在调试期间将其作为控制台应用程序运行。我的想法是我需要实例化服务类并将所有输出吐到控制台。

所以不是使用下面的调用,而是新的实例。

ServiceBase::Run(gcnew myWinService());

目前它是一个骨架,只是想对此有所了解。谢谢!

int _tmain(int argc, _TCHAR* argv[]) {
    if (argc >= 2) {
        if (argv[1][0] == _T('/'))
            argv[1][0] = _T('-');

        if (_tcsicmp(argv[1], _T("-Install")) == 0) {
            array<String^>^ myargs = System::Environment::GetCommandLineArgs();
            array<String^>^ args = gcnew array<String^>(myargs->Length - 1);

            // Set args[0] with the full path to the assembly,
            Assembly^ assem = Assembly::GetExecutingAssembly();
            args[0] = assem->Location;

            Array::Copy(myargs, 2, args, 1, args->Length - 1);
            AppDomain^ dom = AppDomain::CreateDomain(L"execDom");
            Type^ type = System::Object::typeid;
            String^ path = type->Assembly->Location;
            StringBuilder^ sb = gcnew StringBuilder(
                        path->Substring(0, path->LastIndexOf(L"\\")));
            sb->Append(L"\\InstallUtil.exe");
            Evidence^ evidence = gcnew Evidence();
            dom->ExecuteAssembly(sb->ToString(), evidence, args);
        }
    } else
        ServiceBase::Run(gcnew myWinService());
}

【问题讨论】:

  • @0A0D:不是重复的。引用的问题是关于从 Windows 服务启动另一个程序。这个问题是关于将 same 程序作为服务或作为常规进程运行,具体取决于发布/调试模式。
  • 您可以使用#ifdef,这样相关代码就可以编译/不编译。
  • @Merlyn: 是的,但如果所有 OP 的代码都在 myWinService 中会相当微妙,因为您必须手动调用不同的事件处理程序。
  • @Andre:是的,他可能不得不进行一次大的重构。直接在框架的回调中抛出实现往往会使您的应用程序不太容易移植......
  • @Merlyn:在这种情况下,这意味着您正在重新实现部分框架以重用您的代码。

标签: visual-c++ windows-services c++-cli


【解决方案1】:

如果您真的想要,您可以简单地将对ServiceBase::Run() 的调用替换为调用服务方法的自定义代码。由于On*() 服务通知处理程序受到保护,这基本上需要一种解决方法,例如myWinService 的公共方法,它可以自动正确调用通知处理程序。

但是,这是一个非常糟糕的主意,并且感觉有点 hack-ish。您真的应该编写第二个程序,以同步模式执行通常在服务的后台线程(您可能在 OnStart() 方法中启动)中完成的任何操作。

基本上,制作两个程序,为流程类型放置相关的样板代码,并让它们调用相同的代码,这确实包含您的应用程序。

【讨论】:

  • 谢谢,我会试试这个方法
【解决方案2】:

可以通过服务与控制台进行交互。在 Windows 服务属性对话框中查找名为“允许与控制台交互”的复选框。

您也可以考虑将大部分应用程序放在程序集/dll 中,并从控制台应用程序或 Windows 服务调用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多