Создание плагинов на Delphi для чата Commfort

10 минут на чтение

Доброго времени суток дорогие читатели блога. В этой статье я хотел бы поговорить немного о том, как можно создавать плагины для такого известного чата как Commfort. Плагин я разрабатывал именно для своих целей. На работе у нас установлен сервер данного чата, и я написал небольшой плагин для нашего канала, который имеет вид викторины. То есть через некоторое время (задается в настройках плагина) в канал (определенный) выводится сообщение (вопрос) определенной тематики, и пользователи начинают писать ответы, при правильном ответе начисляется баллы, затем можно посмотреть, кто лидирует в викторине и так далее. Можно загружать новые вопросы и ответы, и многое другое.

Вообще мне нравиться писать плагины для различных приложений. Я уже как-то рассматривал статью о том, как можно написать любой плагин для такого приложения как  Download Master. Дело в том, что разработчики Download Master предоставляют довольно расширенную документацию по написанию плагинов к их приложению, да и примеров очень много именно на Delphi, не говоря уже о различных шаблонах, а вот с плагином к Commfort довольно мало информации, только общая и примеры на С++. Да, конечно по примеры можно без проблем переделать в свой пример, на том же самом Delphi, чем я в принципе и занимался. Мне просто было интересно рассмотреть данную тему. Также здесь интересное, что плагины можно писать как для клиентской части, так и для серверной части Commfort.

При создании плагинов для Commfort есть несколько нюансов. Если заметите, то при установке данного чата, в каталоге с программой нет ни одной папки с именем, похожим для того, чтобы определить, куда необходимо устанавливать плагины. Также расширение у самого файла плагин не *.dll, как обычно и в большинстве случаях, так и есть, а немного другое, о котором мы поговорим немного позже. Но естественно данные плагины являются динамическими загружаемыми библиотеками.

Давайте рассмотрим некоторые принципы при создании плагинов на Delphi для Commfort.

  1. Расширение у нашего плагина должно быть «cfcplug», например его вид в итоге должен быть следующим: mynameplugin.cfcplug или же mynameplugin.dll.cfcplug
  2. В обязательном порядке необходимо использовать соглашение _stdcall, для функций плагина.
  3. Плагины должны лежать в папке Plugins, которая должна быть в корне папке, где установлен чат Commfort.  По умолчанию данная папка не создается, поэтому ее необходимо создать вручную (папку Plugins) и положить в нее необходимые плагины, перезапустить Commfort и Ваш плагин должен определиться без проблем.

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

Ну что, давайте теперь приступим к созданию самого плагина и рассмотрению основных функций для создания плагинов.

Основные функции, которые используются для создания плагинов для Commfort:

  • PluginInit – данная функция вызывается при создании плагина, здесь лучше всего предусмотреть выделение памяти для объектов, переменных, если конечно требуется это.
  • PluginTerminate – данная функция вызывается при остановке плагина, здесь соответственно необходимо освобождать память, если Вы при инициализации ее выделяли.
  • PluginProcces – данная функция вызывается при возникновении различных событий: отправка сообщений, получение сообщений, выход из канала и многие другие.
  • PluginShowOptions – данная функция вызывается, когда нажимается на кнопку «Опции плагина» в настройках Commfort.
  • PluginShowAbout – данная функция вызывается, когда нажимается кнопка «О плагине»
  • CommFortGetData – данная функция предназначена для того, чтобы получить информацию от программы: версию, сообщения, какой канал в данный момент активный и так далее.
  • CommFortProcess – данная функция предназначена для того, чтобы инициализировать некоторые события: отправки сообщения, например.

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

Давайте откроем IDE Delphi (у меня Delphi 7) и выполним команду File-New-Other… и в появившемся окне, во вкладке New выберем DLL Wizard и нажмем кнопку Ок. После uses давайте пропишем: {$LIBVERSION ‘cfcplug’} – это для того, чтобы наша библиотека (плагин) компилировался сразу с нужным нам расширением. Хотя это не обязательно делать, расширение можно в любой момент изменить. Давайте назовем нашу библиотеку и сохранием ее, например MyPlugin.

Теперь давайте создадим Unit и зададим ему имя, например Constant, там мы будем перечислять все наши константы плагина. В нем подключим модуль Windows и нам необходимо объявить структуру (запись). Данная запись будет содержать информацию о нашем плагине. Это мы все делаем в данном модуле Constant.pas. Данная запись выглядит у меня следующим образом:

type
 TPluginInfo = packed record
  strPluginName: array[0..254] of Char;
  strPluginDescription: array[0..254] of Char;
  strPluginVersion: array[0..254] of Char;
end;
 PPluginInfo=^TPluginInfo;

Тут все понятно, мы будем перечислять в ней: имя плагина, описание плагина и конечно же версию клиентской или серверной части нашего чата, для которого пишется плагин, это является одним из основных параметров, обязательно указывайте версию. После объявление данной записи, нам необходимо объявить здесь две функции, которая будет получать информацию от программы (CommFortGetData) и которая будет инициализировать события для программы (CommFortProcess), они у меня выглядят следующим образом:

  • TCommFortProcess = function(dwPluginID : DWORD; dwMessageID : DWORD; bMessage : PCHAR; dwMessageLength : DWORD) : BYTE; stdcall;
  • TCommFortGetData = function(dwDataID : DWORD; bBuffer : PCHAR; dwBufferSize : DWORD): DWORD; stdcall;

Затем делаем экспорт наших функций exports PluginInit, PluginProcess; и в самый последний момент, объявляем константы:

const
 PLUGIN_NAME = 'MyPlugin';
 PLUGIN_DESCRIPTION = 'MyPlugin Null Plugin';
 PLUGIN_VERSION = '4.21';

Все понятно, я думаю, объявляем название нашего плагина, его описание и, конечно же, версию клиента или сервера чата, для которого делается наш плагин. Все, с данным модулем бы разобрались и к нему, скорее всего уже возвращаться не будем, поэтому сохраняем его и закрываем. Теперь создаем еще один модуль (Unit), где непосредственно мы будем реализовывать наш функции плагина. Я данный модуль сохранил под название Main.pas.

В данном модуле в uses у меня подключены следующие модули:

uses
  Types,  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Buttons, Dialogs, ExtCtrls, StdCtrls, Constant, OleCtrls;

Как видите здесь присутствует наш модуль констант – Constant. Далее, в данном модуле мы объявляем функции для инициализации плагина (PluginInit) и функция, которая возникает при возникновении некоторых событий в чате (отправка сообщений, выход их канала, получение сообщений и так далее) – функция PluginProcces, у меня это выглядит следующим образом:

function PluginInit(dwThisPluginID : DWORD; plInfo : PPluginInfo; func1 : TCommFortProcess; func2 : TCommFortGetData) : BYTE; cdecl; stdcall;
function PluginProcess(dwMessageID : DWORD; bMessage : PAnsiChar; dwMessageLength : DWORD) : BYTE; cdecl; stdcall;
exports PluginInit, PluginProcess;

Необходимо еще объявить некоторые переменные, а именно:

var
  CommFortProcess: TCommFortProcess;
  CommFortGetData: TCommFortGetData;
  dwPluginID: DWORD;

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

function PluginInit(dwThisPluginID : DWORD; plInfo : PPluginInfo; func1 : TCommFortProcess; func2 : TCommFortGetData) : BYTE;
begin
  dwPluginID := dwThisPluginID;
  plInfo^.strPluginName        := PLUGIN_NAME;
  plInfo^.strPluginDescription := PLUGIN_DESCRIPTION;
  plInfo^.strPluginVersion     := PLUGIN_VERSION;
  CommFortProcess              := func1;
  CommFortGetData              := func2;
  Result := 0;
end;

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

function PluginProcess(dwMessageID : DWORD; bMessage : PAnsiChar; dwMessageLength : DWORD) : BYTE;
var
 msg:TStringStream;
 aStr:WideString;
begin
if dwMessageID=5 then
 begin
  ShowMessage('Было отправлено в чат сообщение!');
 end;
Result:=0;
end;

Здесь мы проверяем, чему равен dwmessageID, если это пять, значит было отправлено сообщение, оно может равняться и 11 и другим значениям, о которых Вы узнаете из файла справки.

Все, теперь нам осталось всего ничего, переходим в нашу динамическую библиотеку, которую мы создавали в первом нашем шаге и в uses прописываем следующее:

uses
  SysUtils,
  Classes,
  Main in 'Main.pas',
  Constant in 'Constant.pas';

То есть просто подключаем сюда наши модули и все, далее компилируем наш проект и в папке, у меня создается файл нашего плагина с расширением cfcplug. Все!!!

Ну, вот и все, теперь давайте протестируем наш плагин. Для этих целей мы идем в папку, куда Вы устанавливали сам Commfort и в ней (если нет папки Plugins) создаем папку Plugins и копируем туда файл плагина. Если у Вас в это время чат Commfort был запущен, то перезапускаем его и отправляем какое-нибудь сообщение в общий канал, если Вы сделали все правильно, то в итоге должно получиться следующее:


Видите, все работает, поэтому Вам остается лишь разработать тот плагин, который необходим именно Вам. В статью я прикладывают справку по созданию плагинов к чату Commfort от разработчиков. В данном архиве Вы также найдете тестовый плагин, написанный на С++, а также я Вам прикладываю в статью исходники Delphi по созданию плагина из данной статьи. Удачи в создании плагинов.

Скачать исходник

Скачать справку

Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

Здравствуйте, в этой новости хочу уделить внимание разработке плагинов на Delphi к DownloadMaster (DM). В прошлой статье мы рассмотрели основные события и методы API DM, которые предоставляют нам разработчики для того, чтобы написать какой-нибудь плагин. Какие...
Работа с файлами является одним из фундаментальных аспектов программирования в Delphi, так как файлы используются для хранения и обмена данными между программами и пользователями. Delphi предоставляет множество функций для работы с файлами. Delphi предоставляе...
Delphi и C++ являются двумя различными языками программирования, которые широко используются для разработки программного обеспечения. Delphi - это интегрированная среда разработки (IDE) и язык программирования, разработанные компанией Borland (в настоящее врем...