У меня есть базовый файл с именем DataCapture.dpr с
program DataCapture;
внутри.
Затем мне пришлось дать другое имя самой службе, чтобы избежать конфликта имен:
TDataCaptureService = class(TService)
Теперь, когда я регистрирую его, служба регистрируется в разделе реестра DataCaptureService, но я хочу:
Как этого добиться?
Попробуйте изменить имя своей службы на DataCapture не во время разработки - я думаю, IDE будет жаловаться на конфликт имен с именем проекта - но во время выполнения в обработчике событий OnCreate
: Name := 'DataCapture';
Я пытался изменить имя в конструкторе. Это не имело никакого эффекта.
То, что вы установили в конструкторе, может быть перезаписано позже, когда компонент службы инициализируется из потока dfm. OnCreate
может быть лучшим местом для этого.
Невозможно осуществить всех трех своих желаний - нужно чем-то жертвовать. В этом случае измените имя вашего проекта на другое, а затем после сборки измените имя EXE на то, что вы хотите. Компилятор Delphi просто не позволит использовать один и тот же идентификатор дважды.
Альтернатива тоже есть. По умолчанию службы, скомпилированные из Delphi, имеют свои собственные параметры /install
/uninstall
, которые вы можете вызывать, которые внутренне используют ваш Name
для службы. Но вы можете проигнорировать это и установить его извне через WinAPI, используя любое имя, которое вы хотите (таким образом, генерируя соответствующий ключ реестра для вашего нового имени).
Спасибо, Джерри, но имя раздела реестра влияет на то, как я запускаю его с net start
из командной строки.
@Paul Нет, это не так - это "имя" службы, которое имеет значение, когда вы запускаете / останавливаете. Windows просто использует имя службы в качестве ключа реестра при установке службы. Единственный раз, когда вам следует позаботиться об этом разделе реестра, - это если вы решите записать Description
службы при установке. Ничего больше.
Даже в этом случае вам все равно не следует писать описание в реестр напрямую, вместо этого вы должны использовать ChangeServiceConfig2()
с dwInfoLevel
, установленным на SERVICE_CONFIG_DESCRIPTION
.
Предотвращение конфликтов имен применяется только в среде IDE во время разработки. Чтобы избежать этого, вы можете просто установить имя своей службы во время выполнения, например в событии OnCreate
:
Name := 'DataCapture';
или, что лучше всего, переопределите метод DoCreate
, потому что OnCreate
предназначен для внешних вещей:
procedure TDataCaptureService.DoCreate();
begin
Name := 'DataCapture';
inherited;
end;
Кстати, вам все равно, под каким ключом реестра он находится. Только для Windows. Я подозреваю, что вы жестко запрограммировали этот ключ реестра внутри своего приложения, поэтому вы не хотите, чтобы он изменялся.