Имя службы Windows Delphi конфликтует с именем проекта

У меня есть базовый файл с именем DataCapture.dpr с

program DataCapture;

внутри.

Затем мне пришлось дать другое имя самой службе, чтобы избежать конфликта имен:

TDataCaptureService = class(TService)

Теперь, когда я регистрирую его, служба регистрируется в разделе реестра DataCaptureService, но я хочу:

  1. Чтобы зарегистрировать его в разделе реестра «DataCapture»
  2. Чтобы сохранить имя файла DataCapture.exe
  3. Чтобы сохранить имя файла DataCapture.dpr

Как этого добиться?

Кстати, вам все равно, под каким ключом реестра он находится. Только для Windows. Я подозреваю, что вы жестко запрограммировали этот ключ реестра внутри своего приложения, поэтому вы не хотите, чтобы он изменялся.

Jerry Dodge 08.08.2018 15:21

Попробуйте изменить имя своей службы на DataCapture не во время разработки - я думаю, IDE будет жаловаться на конфликт имен с именем проекта - но во время выполнения в обработчике событий OnCreate: Name := 'DataCapture';

Ondrej Kelle 08.08.2018 16:08

Я пытался изменить имя в конструкторе. Это не имело никакого эффекта.

Paul 08.08.2018 18:10

То, что вы установили в конструкторе, может быть перезаписано позже, когда компонент службы инициализируется из потока dfm. OnCreate может быть лучшим местом для этого.

Ondrej Kelle 08.08.2018 18:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
273
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Невозможно осуществить всех трех своих желаний - нужно чем-то жертвовать. В этом случае измените имя вашего проекта на другое, а затем после сборки измените имя EXE на то, что вы хотите. Компилятор Delphi просто не позволит использовать один и тот же идентификатор дважды.


Альтернатива тоже есть. По умолчанию службы, скомпилированные из Delphi, имеют свои собственные параметры /install/uninstall, которые вы можете вызывать, которые внутренне используют ваш Name для службы. Но вы можете проигнорировать это и установить его извне через WinAPI, используя любое имя, которое вы хотите (таким образом, генерируя соответствующий ключ реестра для вашего нового имени).

Спасибо, Джерри, но имя раздела реестра влияет на то, как я запускаю его с net start из командной строки.

Paul 08.08.2018 15:25

@Paul Нет, это не так - это "имя" службы, которое имеет значение, когда вы запускаете / останавливаете. Windows просто использует имя службы в качестве ключа реестра при установке службы. Единственный раз, когда вам следует позаботиться об этом разделе реестра, - это если вы решите записать Description службы при установке. Ничего больше.

Jerry Dodge 08.08.2018 15:27

Даже в этом случае вам все равно не следует писать описание в реестр напрямую, вместо этого вы должны использовать ChangeServiceConfig2() с dwInfoLevel, установленным на SERVICE_CONFIG_DESCRIPTION.

Remy Lebeau 08.08.2018 17:25
Ответ принят как подходящий

Предотвращение конфликтов имен применяется только в среде IDE во время разработки. Чтобы избежать этого, вы можете просто установить имя своей службы во время выполнения, например в событии OnCreate:

Name := 'DataCapture';

или, что лучше всего, переопределите метод DoCreate, потому что OnCreate предназначен для внешних вещей:

procedure TDataCaptureService.DoCreate();
begin
  Name := 'DataCapture';
  inherited;
end;

Другие вопросы по теме