Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подземелье Магов
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  13:51[Войти] | [Зарегистрироваться]

Обсуждение материала
Создание служб Windows в Delphi с использованием VCL
Полный текст материала


Другие публикации автора: Александр Алексеев

Цитата или краткий комментарий:

«... Статья посвящена вопросам создания служб (сервисов) Windows в Delphi с использованием VCL, т.е. не на Windows API (WinAPI). Она предназначена для людей, собирающихся написать или уже написавших свою первую службу Windows. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]12100%
 
  Ничего особенно нового и интересного
[2]00%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 12

Оценка стиля изложения

  Все понятно, материал читается легко
[1]981.8%
 
  Есть неясности в изложении
[2]218.2%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 11




Смотрите также материалы по темам:
[Сервисы системы]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 26

23-08-2017 12:01
Замечание про создание через реестр своей ветки лога, о котором упоминается в п.7. После того, как под EventLog создан раздел CustomLog, там должен быть создан ключ Sources с типом REG_MULTI_SZ. В значение этому ключу надо занести имя службы. Соответственно, посмотреть в раздел Application и убрать имя службы из Sources.


25-01-2014 11:35
Отлична статья, приятно было почитать.
Хотел бы только внести одно дополнение по поводу оснастки ММС. Лично мне, управление настройками службы через ММС, кажется более муторным нежели обычное приложение-конфигуратор лежащее рядом со службой ну или на крайний случай та же служба только с ключом вызова конфигурации.
Но, коль речь об этом все же в статье заходит, то способ есть и реализовать его не сложнее, чем написать саму службу. Правда при добавлении оснастки появится дополнительный этап выбора элемента (но это единственная жертва ;-) ).
Суть реализации заключается в создании ActiveX-формы с желаемыми настройками, регистрации полученного ОСХ-файла по средствам Regsvr32 в системе и добавлении полученного элемента ActiveX в свою консоль (Консоль->Добавить или удалить оснастку->Добавить->Элемент ActiveX (тот самый лишний этап)->{Название своей формы});
Вот собственно и все манипуляции для последующего созерцания своего элемента управления в дереве консоли.
А за статью спасибо!


04-06-2013 03:27

вопрос: Имеются ли ограничение на службу и как их обойти?
ситуация: пытаюсь реализовать запись содержимого рабочего стола в виде ролика в службе.


Начиная с Vista, службам запрещено взаимодействовать с рабочим столом.


31-05-2013 07:17
вопрос:
Имеются ли ограничение на службу и как их обойти?
ситуация:
пытаюсь реализовать запись содержимого рабочего стола в виде ролика в службе. Если запускаю приложение ЕХЕ вся информация корректно записвается если запускаю как службу - на выходе чёрный экран, и размер видеофайла в десятки (сотни) раз менее нормального.


17-01-2013 09:40
Спасибо за статью. Благодаря четко изложенному и тщательно разжеванному материалу только что дописал свой первый сервис для клиент-серверной системы. Для обмена пакетами использовал UDP. Клиентская часть для хранения локальных данных использует MS SQL Server 2000 DE, "слушает" ком-порт на предмет прикладывания электронного браслета. Серверная часть коннектится к БД Б52 (Firebird) и выполняет "прихоти" вопрошающих клиентов. Получилась конфетка :)
Еще раз спасибо! Сильно мне время на написание продукта сократили.

P.S. При попытке отправить комментарий почему-то происходит выход из системы...


26-10-2012 09:55
Для задания описания службы есть функция ChangeServiceConfig2, она не описана в Дельфях как минимум до 2010 версии, хотя присутствует в API аж с Win2k.
Минимальный набор деклараций под D2010 (Wide версии, под Ansi было лениво делать):


const
  SERVICE_CONFIG_DESCRIPTION = 1;

type
  PServiceDescription = ^TServiceDescription;
  _SERVICE_DESCRIPTION = record
    lpDescription: PWideChar;
  end;
  SERVICE_DESCRIPTION = _SERVICE_DESCRIPTION;
  TServiceDescription = _SERVICE_DESCRIPTION;

function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD; lpInfo: Pointer): BOOL; stdcall;
           external advapi32 name 'ChangeServiceConfig2W';



Применение:


var
  Descr: TServiceDescription;

  Descr.lpDescription := PChar(SvcDescr);
  ChangeServiceConfig2(hSvc, SERVICE_CONFIG_DESCRIPTION, @Descr);



16-03-2009 05:27
сообщение от автора материала
Вопросы лучше задавать на круглом столе. Здесь идёт обсуждение статьи.


15-03-2009 23:18
Я пишу лакальный почтовый сервер хочу оформить его как сервис. Весь почтовик написан на VCL компонентах
Indy, капаясь с сервисами наткнулся на Services application и статью Александр Алексеева.Внимание вопрос:
Можно ли вставить компоненты VCL такие как TidSMTPServer,TidPOP3Server,TidMessager и как ими воспользоваться из Services Application. Как я понимаю стандартны события здесь не прокатят.
Помогите очень надо курсач доделать.Зарание спасибо.


30-12-2008 08:33
сообщение от автора материала
Services in Windows Vista - документ, описывающий изменения в Windows Vista, касающиеся служб.


21-08-2008 10:35

В дополнение к написанному - грабли на которые я наступил ...



... копируем скомпилированный exe-файл в C:\Windows\System32\ (или в эквивалентную папку на вашей машине). Копирование — опционально, но рекомендуется; вообще говоря, exe-файл службы может находиться в любом месте (с учётом некоторых особенностей ...
... Затем запускаем exe-файл с параметром "/install" ...


Я не выполнял копирование exe-файла в C:\Windows\System32\, соответственно обнаружил одну важную особенность, при использовании в службе обращений к файловой системе по относительным путям.
А именно то, что в момент инсталяции службы исходной считается та папка в которой расположен exe-файл, а в момент ее запуска - папка C:\Windows\System32\.

Вывод: необходимо всегда точно указывать путь к ресурсам файловой системы.


Автору спасибо за подробно изложенный материал



24-06-2008 02:45
сообщение от автора материала
Да, вы правы, корректнее указывать полный идентификатор сообщения. Хотя будет работать, даже если указывать только код сообщения, без кода оборудования и статуса. Сейчас внимательно просмотрел документацию и не нашёл подтверждения работоспособности такого способа, поэтому вероятно это - особенность реализации. На неё лучше не ориентироваться.
Когда писал статью, меня, видимо, смутила некоторая перегруженность информацией. Например, статус (ошибка, предупреждение и т.п.) указывается и в идентификаторе сообщения и в LogMessage.


18-06-2008 05:03
У меня .mc файл такого содержания:
MessageIdTypedef=DWORD
LanguageNames=(English=0x409:MSG00409)
LanguageNames=(Russian=0x419:MSG00419)
MessageId=0x3
SymbolicName=MSG_NOT_CONFIGURED
Severity=Error
Language=English
Daemon was not configured
.
Language=Russian
Демон не был сконфигурирован
.

при компиляции дает такой .h:
//
//  Values are 32 bit values layed out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-+-----------------------+-------------------------------+
//  |Sev|C|R|     Facility          |               Code            |
//  +---+-+-+-----------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      R - is a reserved bit
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//
//
// Define the facility codes
//


//
// Define the severity codes
//


//
// MessageId: MSG_NOT_CONFIGURED
//
// MessageText:
//
//  Daemon was not configured
//
#define MSG_NOT_CONFIGURED               ((DWORD)0xC0000003L)
- старшие биты взведены, как MS и обещал в комментарии.


18-06-2008 02:38
сообщение от автора материала
>>> - и получаем в eventlog'е нечто неудобочитаемое. Потому что Severity=Error и в "настоящем" идентификаторе сообщения взведены старшие биты.
Мммм, вообще-то получаем всё как надо.
У меня в MessageTable exe-файла попадают сообщения с номерами 1-8. Т.е. фактически получается, что указание типа сообщения, Facility и т.п. в mc-файле ни на что не влияет. И получается, что все старшие биты равны 0. Не знаю, может быть, я всё же что-то не так делаю.
Если у вас есть, чем поделиться по этой теме - высказывайтесь.


17-06-2008 13:38
"Например, чтобы добавить в лог сообщение типа "служба не сконфигурирована" (для самого первого примера mc-файла), пишем:

LogMessage ('', EVENTLOG_WARNING_TYPE, 0, 3);"
- и получаем в eventlog'е нечто неудобочитаемое. Потому что Severity=Error и в "настоящем" идентификаторе сообщения взведены старшие биты.


31-05-2008 05:19
сообщение от автора материала
Для служб появляется дополнительный фактор: чем больше служб запущено на машине, тем более велика вероятность обнаружения уязвимости в них. Даже если служба недоступна по сети, её уязвимость может помочь повысить хакеру свои привиегии. Чем меньше запущено служб, тем меньше "площадь атаки" (окей, я не говорил это на 100% серьёзно, т.к. почти все мы сидим под админами).
Ответьте сами себе на примерно такие вопросы, чтобы определить как правильнее будет сделать ваше приложение - в виде службы или нет, и если да, то с какой конфигурацией:
  • вы действительно считаете, что функциональность вашей службы понадобится каждому пользователю вашей программы? Подумайте о возможных сценариях работы, возможно часто службу вообще не нужно ставить (окей, это не применимо к чисто серверным приложениям вроде http/ftp-сервера). Лучшая служба - которой вообще нет, а всё делается само собой.
  • если вы всё же ставите службу - подумайте, стоит ли её делать автозапускающейся? Как часто пользователю нужна будет функциональность службы? Может быть имеет смысл поставить её на ручной запуск? Особенно внимательно посмотрите, что будет если пользователь не в курсе об услугах, которые предоставляет служба? Может быть стоит выключить не устанавливать службу, пока пользователь не обнаружит эту функциональность и не захочет её использовать? Удобно использовать что-то вроде RunOnce для уведомления о вашей новой супер-пупер крутой фишке.
  • если у службы есть визуальный интерфейс и она работает только в паре с ним, то серьёзно рассмотрите возможность ручного запуска и остановки службы из визуального интерфейса (с учётом того, что их может быть запущено несколько).
  • постарайтесь уменьшить суммарное число процессов. Если у вы хотите сделать более одной службы, подумайте - может быть имеет смысл слить их в одну? Если вам уж так приспичило две службы - делайте их в одном процессе. Единственная причина, когда нужно существование более одного процесса - это запуск с разными привилегиями (как это может делать, скажем FTP-сервер - по процессу на пользователя). Не для служб ещё может быть нужным запуск двух процессов для увеличения надёжности - когда один автоматом поднимает второй при его вылете. Для служб эта функциональность достигается настройкой SCM.
  • аналогичные замечания можно привести и по потокам в процессе. Не плодите их без необходимости. Каждый новый поток жрёт памяти как минимум с новый размер стека.
  • ... и по DLL. Загружайте DLL только тогда, когда они вам действительно необходимы!
  • отдельный разговор - автообновлялки. Простой ответ: никогда не делайте автообновлялки в виде служб или других постоянно висящих процессов. Не поймите меня неправильно, автообновлялки - великая вещь, но зачем делать их в виде процессов? С этим отлично справится задание в планировщике или запуск обновления при старте GUI программы. Меня просто бесит когда я ставлю приложение, чтобы использовать его два раза в год, а оно мало того, что вешает всякие updater-ы мне в автозагрузку, так ещё и достаёт меня всякими всплывающими "New update available!" (а если при этом у меня хоть раз свернётся игра, то этой проге больше не жить у меня на компе). Либо пусть скачивает и обновляет втихую (только убедитесь, что пользователь в курсе, например - при установке настроить), либо показывайте где-нибудь при запуске GUI. Например, красным в заголовке.


31-05-2008 05:18
сообщение от автора материала
А кто-то ещё скажет: с современными системами лишние 50 процессов не играют значения. Извините, играют. Может быть не на топовой машине, но не все же сидят на такой. Огромное число людей сидят на машинах многолетней давности и не собираются их менять. Для них эти мусорные процессы существенно замедлят запуск машины и её работу (пусть они почти всегда стоят, но что-то же они иногда делают; плюс они жрут память, иногда немалую). Каждое такое добавление занимает минимум 1 процесс! А иногда и больше. Создание процесса - это весьма ресурсоёмкая операция в Windows. Кроме того, эти дурацкие значки в трее засоряют его и я дольше не могу найти там нужные. И эти факторы могут оказаться решающими, почему люди не выберут вашу программу.
Как я уже сказал, это моя машина и я не желаю тратить её работу на воздух (в виде зря потраченной работы моего железа). Если каждая программа будет создавать свою службу на автозапуске, запускать пяток процессов поддержки (уверен, что поддержки функциональности, которой я не пользуюсь), создавать по два значка в трее (ага, один постоянный и один всплывающий с назойливыми сообщениями, которые мне не нужны), то....


31-05-2008 05:18
сообщение от автора материала
В один хороший день я просто приду в ярость от того количества crapware, что у меня установленно, и удалю их подчистую. И уж будьте уверены, не установлю снова.
Не повторяйте их ошибок. Запомните: это - МОЙ компьютер. И здесь я бог и царь, и никому не позволено делать что-то без моего ведома. При установке обязательно показывайте опции, позволяющие отключить компоненты, которые стартуют при запуске системы. Для тех из них, кто виден визуально (значок в трее), такое в принципе можно пропустить. С той оговоркой, что в меню значка обязательно будет пункт "Скрыть и больше не показывать". Для случая служб такой пункт тоже можно опустить, но опять-таки, с оговоркой что служба установится в ручном режиме запуска!
Конечно, кто-то скажет: не велика беда. Мы не тревожим при установке пользователя лишними вопросами, а при необходимости можно и отключить всё вручную.
Да, можно. Но что вам мешает сделать quick и expert-варианты установки? Почему я обязан наизусть помнить эти долбанные ключи реестра, отвечающие за автозагрузку? Проснитесь, это Windows, а не Linux.


31-05-2008 05:18
сообщение от автора материала
И хоть это не имеет прямого отношения к теме, но сюда же можно отнести и всякие "My games" и "My ebooks" в Моих документах! Microsoft сделала большую ошибку, введя папки типа "Моя музыка" и "Мои рисунки". Нет, ничего плохого нет в том, что они появляются из коробки, подталкивая пользователя к наведению порядка в своей рабочей папки. Проблема в том, что многие программы, не подумав, создают в моих документах свои аналоги (и часто - не локализованные). Но первейшее правило гласит: в папке мои документы не должно быть файлов, которые созданы не пользователем. Это МОИ документы, что здесь деляют сейвы от GTA? А этот My ebooks? Я до сих пор не могу найти [CENSORED], который постоянно упрямо пересоздаёт эту папку. Как только я его найду - ноги его на моей машине больше не будет. Для данных приложения есть Application Data, а папка мои документы - для меня и ТОЛЬКО для меня. Абсолютно без исключений. Я знаю немало людей, которые из-за таких вот приложений просто забрасывают папку мои документов и создают какую нибудь C:\Documents\Shurik\


31-05-2008 05:17
сообщение от автора материала
To be a service or not to be a service...  на самом деле это интересный вопрос. Несмотря на чёткую формулировку: всё, что является в каком-то виде серверным следует делать в виде службы. И хотя у каждого правила есть исключения, всё же поражает какие совершенно неподходящие задачи люди иногда суют в свои службы.
На самом деле я хотел больше сказать про развёртывание (я не говорю сейчас про корпоративное ПО). Очень важно при установке вашего продукта убедиться, что пользователь в курсе и может контролировать установку служб и приложений автозагрузки. Почему-то многие программы считают своим долгом установить какое-то говно в автозапуск и обязательно показать значок в трее! Эти три каких-то процесса, запущенные службой от ATI, её же дурацкий значок в трее, долбанный QuickTime, который считает установку значка в трей своим долгом, не иначе. От bluetooth адаптера висит не меньше четырёх процессов (при том, что он вставляется сестрой раз в два месяца, обменяться файлом с телефоном)! Очень часто бывают всякие обновлялки, которые постоянно висят в памяти (примеров привести не могу, т.к. у себя-то я их почистил). Список можно продолжать жо бесконечности. Посмотрите - и у себя на машине вы найдёте немало мусора. Это ДЕЙСТВИТЕЛЬНО так необходимо? Зачем МНЕ всё это? ATI действительно считает, что я буду менять разрешение каждые два дня?


30-05-2008 11:21
сообщение от автора материала
>>> 2. Автор писал для опытных, но все же рекомендую описать случаи, которые по его мнению требуют знания написания служб!
Статья позиционировалась как материал для тех, кто хочет написать службу. Т.е. решение уже принято :)
Служба - это всего лишь обычное приложение, которое просто исполняется в несколько других условиях, чем обычные приложения. Нужно просто рассмотреть, насколько нужно/оправдано это в вашем конкретном случае.
Обычно в качестве служб нужно оформлять высоконадёжные серверные приложения, работающие 24/7. Т.е. как только вы видите, что ваше приложение является серверным по своей сути - это серьёзная причина, чтобы сделать его в виде службы. Является ли ваше приложение серверным (предоставляющим какие-либо услуги клиентам) - это уже решаете вы. Кроме того, можно оформить приложение в виде службы, если вам нужны какие-либо бонусы, которые доступны службам (высокие привилегии, удобство администрирования и т.п.).

>>> 3. Рекомендовал бы автору дополнить информацией SecurityAttributes, какие тонкости на его взгляд следует учесть.
Во-первых, эта тема несколько не входит в материал для целевой аудитории: людей начинающих писать свою первую службу. Во-вторых, по поводу безопасности не получится дать горстку "best-practice", чтобы всё всегда было хорошо. Это большая и сложная тема, которую лучше рассматривать отдельно. На королевстве уже есть несколько неплохих статей по безопасности (ссылки есть и в конце моей статьи). Но лучше всего почитать подходящую книжку. Например, это может быть Рихтер с книжкой о службах ("Программирование серверных приложений Windows") или Майкл Ховард с его "Writing secure code".
Возможно, попозже я что-нибудь в этом направлении и напишу.


29-05-2008 05:41
Млин, не смотря на то что есть неясности и не все понятно с первого раза при прочтении, автора стоит все же похвалить за проделанный труд! Так держать! Молодец!

А теперь, что же не ясно то ?
1. Автор не подчеркнул, что после сообщения для лога на одном языке через точку можно перечислять на другом:
Language=English
Unhandled exception raised at destroy: %1
.
Language=Russian
Возникло необработанное исключение при завершении: %1

А этот факт, желательно выделить! Чтобы читателю сразу в голову въелась эта тонкость.

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

3. Рекомендовал бы автору дополнить информацией SecurityAttributes, какие тонкости на его взгляд следует учесть.


26-05-2008 18:57
сообщение от автора материала
>>> А можно это расшифровать? С примером.
А расшифровывать особо и нечего. Вроде обо всём было рассказано.
Давайте я отмечу ключевые моменты, а вы скажете, чего не хватает.

Вы создаёте проект и добавляете в него несколько служб (TService):

Как уже было сказано, в одном проекте (соответственно, exe-файле) может быть несколько служб. Чтобы добавить ещё одну службу в текущий проект, лезем в File/New/Other и там выбираем "Service" (а не "Service Application", как было ранее). В BDS пункт "Service" в разделе "Delphi Files" появляется только, если текущий проект является проектом службы. В Delphi 7 и ниже пункт "Service" виден всегда, он всегда создаёт пустой модуль с TService.

В этих модулях служб вы можете использовать общие глобальные переменные и, таким образом, осуществлять обмен данными между двумя и более службами. Это аналог того, как две формы располагаются в одном GUI-приложении и не требуют применения средств межпроцессного взаимодействия, чтобы перекинуть данные с одной формы на другую, т.к. формы находятся в одном exe-файле.

Единственное, что нужно проверить - что SCM действительно запускает службы в одном процессе:

Если при попытке запуска новой службы SCM обнаружит, что служба размещается в уже запущенном приложении, то он просто отправит приложению сообщение о запуске новой службы и не будет пытаться запустить новый процесс. Если в реестре путь к одному и тому же exe-файлу двух служб указан по-разному, то SCM не сумеет определить, что это один файл и запустит два процесса вместо одного.


26-05-2008 08:15

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

А можно это расшифровать? С примером.



23-05-2008 07:54
Про логирование хорошо написано, я в свое время с этим помучался.


23-05-2008 06:57
Очень логично. Автор молодец.


22-05-2008 07:50
Хорошо все разложено по полочкам. Охвачены почти все аспекты реализации. Ничего лучше на русском не встречал.
Нет ничего правда про сервисы с COM интерфейсами.
 Srgk


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Кто съел Красную шапочку?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования