Давайте рассмотрим, что здесь говорит спецификация C ++ 14 о инициализации списка. [dcl.init.list] 3 имеет последовательность правил, которые должны применяться по порядку:
3.1 не применяется, поскольку Foo
не является совокупностью.
3.2 не применяется, поскольку список не пуст.
3.3 не применяется, поскольку Foo
не является специализацией initializer_list
.
3.4 действительно применяется, поскольку Foo
- тип класса. В нем говорится о конструкторах с разрешением перегрузки в соответствии с [over.match.list]. И это правило говорит, что сначала проверить initializer_list
конструкторы . Поскольку ваш тип имеет конструктор initilaizer_list
, компилятор должен проверить , чтобы узнать, может ли быть изготовлен initializer_list
, соответствующий одному из этих конструкторов, из данных значений. Он может, поэтому это то, что должно называться .
Короче говоря, GCC прав, а Clang ошибочен .
Следует отметить, что рабочий проект C ++ 17 изменяет ничего об этом. Он имеет новый раздел 3.1, который имеет специальную формулировку для списков с одним значением, но применяется только к агрегатам . Foo
не является совокупностью, поэтому он не применяется.
Установка Вашего исполняемого файла как услуга является частью его, но реалистично это обычно обрабатывается любым программным обеспечением установки, которое Вы используете. Можно использовать инструмент SC командной строки при тестировании (или если Вам не нужен установщик).
Важная вещь состоит в том, что Ваша программа должна назвать StartServiceCtrlDispatcher () после запуска. Это подключает Ваш сервис к диспетчеру управления службами и настраивает стандартную программу ServiceMain, которая является Вашими сервисами основная точка входа.
ServiceMain (можно назвать его вообще, Вам нравится на самом деле, но это всегда, кажется, ServiceMain), должен затем назвать RegisterServiceCtrlHandlerEx () для определения стандартной программы обратного вызова так, чтобы ОС могла уведомить сервис, когда определенные события имеют место.
Вот некоторые отрывки от сервиса, который я записал несколько лет назад:
настроенный как сервис:
SERVICE_TABLE_ENTRY ServiceStartTable[] =
{
{ "ServiceName", ServiceMain },
{ 0, 0 }
};
if (!StartServiceCtrlDispatcher(ServiceStartTable))
{
DWORD err = GetLastError();
if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
return false;
}
ServiceMain:
void WINAPI ServiceMain(DWORD, LPTSTR*)
{
hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0);
обработчик сервисов:
DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*)
{
switch (ControlCode)
{
case SERVICE_CONTROL_INTERROGATE :
// update OS about our status
case SERVICE_CONTROL_STOP :
// shut down service
}
return 0;
}
Надеюсь, это поможет:
http://support.microsoft.com/kb/251192
Казалось бы что Вы простая потребность выполнить этот exe против двоичного исполняемого файла для регистрации его как услуга.
В основном существуют некоторые настройки реестра, которые необходимо установить, а также некоторые интерфейсы для реализации.
Проверьте это: http://msdn.microsoft.com/en-us/library/ms685141.aspx
Вы интересуетесь SCM (Диспетчер управления службами).
Я знаю, что немного опаздываю на вечеринку, но недавно у меня был такой же вопрос , и мне пришлось пробираться через сеть в поисках ответов.
Мне удалось найти в MSDN эту статью, которая действительно закладывает основу. В итоге я объединил многие файлы в один исполняемый файл, содержащий все нужные мне команды, и добавил в свой собственный метод void run (), который циклически повторяется в течение всего срока службы службы для моих собственных нужд.
Это было бы отличным началом для кого-то еще, задающего именно этот вопрос, так что будущим поисковикам, обратите внимание:
Полный пример службы http://msdn.microsoft.com/en-us/ library / bb540476 (VS.85) .aspx