C ++ / CLI服务,在调试期间作为控制台应用程序运行

时间:2011-06-21 16:32:24

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

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

因此,不是使用以下调用,而是新实例。

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());
}

2 个答案:

答案 0 :(得分:2)

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

然而,这是一个非常糟糕的主意,感觉有些黑客攻击。您应该编写第二个程序,以同步模式执行服务的后台线程(您可能在OnStart()方法中启动)中通常执行的任何操作。

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

答案 1 :(得分:0)

有一些功能可以从服务与控制台进行交互。在Windows服务属性对话框中,查找名为“允许与控制台交互”的复选框。

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