Об IRC. Доступно и со вкусом.

Руководство по написанию DLL для mIRC в Delphi. Часть 1.

Статья познакомит вас с азами написания простейших DLL для mIRC, познакомит с корректными вызовами, результатами выполнения.
Руководство по написанию DLL для mIRC в Delphi.
Часть 1.

Все это дело тестировалось и собиралось на mIRC 6.21 и Delphi 7.

В Интернете довольно мало информации о том, как собрать самому DLL для mIRC. Хотя по быстроте работы и по своим возможностям DLL куда быстрее скриптов.

Итак, начнем.
DLL (Dynamic Link Libraries) – это один из самых быстрых и удобных способов обработки и сбора информации из других приложений или окон, с которыми mIRC не взаимосвязан.
Каждый из вас может сможет создать простенькую DLL, это в принципе просто, не смотря на все устрашающие разговоры на эту тему. DLL маленькие по размеру и многофункциональны по возможностям. Они включают в себя набор процедур и функций для использования в других программах. Так зачем же они нам понадобятся в mIRC? На пример, если вы хотите узнать размер физической памяти своей операционной системы, переключить программно текущую раскладку клавиатуры или же на конец переключить на любимую песенку свой Winamp.
Статья подразумевает, что вы имеете базовые навыки работы с программной средой Delphi, в нашей же статье, мы будем кодить на Delphi 7, наиболее стабильной и ненагруженной лишним хламом версии.

Итак, в Delphi, выбираем меню File и нажимаем New. Из списка выбираем DLL, если в нем нет такого пункта, выбираем Other и там уже ищем DLL. В итоге вы увидите что-то такое:
library Project1;

uses
SysUtils,
Classes;

{$R *.RES}

begin
end.

Для удобства можно выбрать в меню Project подменю Options и на закладке Directories and Conditionals указать путь до папки с mIRC. Теперь после компилирования DLL, она окажется в папке с mIRC.

Пишем нашу первую функцию, которая вернет 'hello world'.
function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean) :integer; stdcall;
begin
StrCopy(data,'Hello World!');
Result := 3;
End;

Если вы еще не знаете, то все процедуры и функции в Delphi должны вставляться между uses и begin. Также добавьте unit windows в список uses. На пример:
uses
Windows, SysUtils, Classes;

Итак, разберемся по кусочкам, что означает каждая переменная (взято из файла помощи к mIRC)

mWnd – хэндл главного окна mIRC.
aWnd – хэндл окна в котором должна выполнятся команда, может быть и не только активным окном, если команда вызывается удаленным скриптом.
data – информация, которую вы желаете послать DLL. DLL может заполнить эту переменную командой, которую mIRC должен будет выполнить, если таковая имеется.
parms – переменная заполняется DLL после выполнения параметрами, которыми mIRC должен будет выполнить при выполнении команды из переменной data.
show – переменная может быть FALSE, если префикс . был указан для скрытия выполнения команды, в противном случае TRUE.
nopause – переменная может быть TRUE, mIRC в критической для выполнения процедуре и DLL не должна ничего делать, что может вызвать паузу в процессе, например DLL не должна дать выскочить диалогу

Результаты выполнения функции могут быть следущими:
0 означает, что mIRC должен прервать процесс командой /halt
1 означает, что mIRC должен продолжать процесс
2 означает, что DLL заполнило переменную data командой, которую mIRC должен выполнить, и что заполнило переменную parms параметрами при выполнении команды
3 означает, что DLL заполнило переменную data результатом, который идентификатор $dll() должен вернуть.

Таким образом StrCopy(data,'Hello World!'); просто скопирует строку Hello World в переменную data. Не следует писать так data := 'Hello World';. Результат 3 и будет обозначать, что вам следует использовать идентификатор $dll в mIRC для получения данных из переменной data.

И нам следует добавить еще одну вещь в наш проект перед компилированием, это добавление секции exports. После нашем функции вставьте это:
Exports Helloworld;

Это позволит mIRC иметь доступ к функции внутри нашей DLL под названием helloworld.

Теперь, открываем меню Project и нажимаем подменю Build Project. Все наша DLL готова! Открываем mIRC и пишем //echo -a $dll(project1.dll,helloworld,NOT_USED). И видим надпись Hello World! Нам не нужно использование 3-го параметра, потому что мы не посылаем никаких данных нашей DLL. Если у вас возникли какие то ошибки при компиляции, попробуйте прочитать статью заново или спрашивайте на форуме.

Поздравляю, вы только что создали свою первую DLL

Полный ее исходник выглядит так:
library Project1;

uses
Windows, SysUtils, Classes;

function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer; stdcall;
begin
StrCopy(data,'Hello World!');
Result := 3;
End;

exports
helloworld;

{$R *.RES}

begin
end.

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

function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer; stdcall;
begin
StrCopy(data,'/echo -a Hello World!');
Result := 2;
End;

Компилируем заново и набираем в mIRC команду /dll project1.dll helloworld , которая и вернет нам Hello World! Как видите, мы изменили result на 2. Что и “приказало” mIRC выполнить команду из переменной data, которое имело вид /echo -a.

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

P.S. При написании статьи были использованы примеры и информация с mircscripts.org