Служба C ++ / CLI, запускаемая как консольное приложение во время отладки - PullRequest
2 голосов
/ 21 июня 2011

Я пытаюсь создать новую службу 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());
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Если вы действительно хотели, вы могли бы просто заменить вызов ServiceBase::Run() пользовательским кодом, который вызывает методы обслуживания. Поскольку обработчики уведомлений службы On*() защищены, для этого обычно требуется обходной путь, такой как открытый метод myWinService, который автоматизирует надлежащие вызовы обработчиков уведомлений.

Тем не менее, это действительно плохая идея, и кажется, что она взломана. Вы действительно должны написать вторую программу, которая выполняет все, что обычно делается в фоновом потоке службы (который вы, вероятно, запускаете в методе OnStart()) в синхронном режиме.

По сути, создайте две программы, которые помещают соответствующий код котельной пластины для типа процесса и заставляют их вызывать тот же код, который действительно содержит ваше приложение.

0 голосов
/ 21 июня 2011

Существует некоторая возможность взаимодействия с консолью из службы. В диалоговом окне свойств службы Windows найдите флажок «разрешить взаимодействие с консолью».

Вы можете также рассмотреть возможность помещения большей части вашего приложения в сборку / dll и вызова функций из консольного приложения или службы Windows.

...