Технология создания плагинов и программ-дополнений

Здесь обсуждаются графические оболочки, боты, языковые файлы и другие дополнения к CommFort 4.
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

Re: Технология создания плагинов и программ-дополнений

Сообщение VIRUS »

Уууу..., даже не знаю тогда, я думал, что Builder C++, ну тогда верни все назад :), что я наподсказывал. Возможно
вместо этого

Код: Выделить всё

extern "C" __declspec(dllexport) BYTE PluginInit(DWORD dwThisPluginID, sPluginInfo *plInfo, sBotUserInfo *botInfo, typeCommFortProcess);
напиши вот это

Код: Выделить всё

extern "C" __declspec(dllexport) BYTE PluginInit(DWORD dwThisPluginID, sPluginInfo *plInfo, sBotUserInfo *botInfo, typeCommFortProcess func1);
это мои догадки, я в этой среде никогда не работал.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Joneg
Сообщения: 11
Зарегистрирован: 10:15, 09.09.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение Joneg »

да хоть вот так:

Код: Выделить всё

__declspec(dllexport) BYTE __cdecl PluginInit(DWORD, sPluginInfo*, sBotUserInfo*, typeCommFortProcess);
Не в этом дело. Это прототип, на названия переменных тут пофиг.
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

Re: Технология создания плагинов и программ-дополнений

Сообщение VIRUS »

Ну поверь, я видел случаи, что компиляторы и на такое выдавали ошибку :), правда старые :).
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Joneg
Сообщения: 11
Зарегистрирован: 10:15, 09.09.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение Joneg »

Ну может быть наоборот я заблуждаюсь. Но в данном случае компилятор позволяет так делать...
А в билдере значит данный код бы работал?
Последний раз редактировалось Joneg 19:09, 17.12.2009, всего редактировалось 1 раз.
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

Re: Технология создания плагинов и программ-дополнений

Сообщение VIRUS »

Могу дать только один совет, поискать на форумах, как правильно работать с DLL в MinGW 3.4.5.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Joneg
Сообщения: 11
Зарегистрирован: 10:15, 09.09.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение Joneg »

Так а почему тогда обращение к функциям то происходит нормально?
Опции\Описание\Инициализация. Функции ведь отрабатывают... MSBBox-ы вылетают.
ДЛЛ-ки не писал никогда... Может чего то и недопонимаю. Почему это работает а это нет...
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

Re: Технология создания плагинов и программ-дополнений

Сообщение VIRUS »

Joneg писал(а):А в билдере значит данный код бы работал?
Что я исправил да.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Joneg
Сообщения: 11
Зарегистрирован: 10:15, 09.09.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение Joneg »

Добавил преписку: __stdcall
Добавил ключи к линковцищу: -Wl,--add-stdcall-alias
Имена функций стали выглядеть так:

PluginInit
PluginInit@16
PluginProcess
PluginProcess@12
PluginShowAbout
PluginShowAbout@0
PluginShowOptions
PluginShowOptions@0
PluginTerminate
PluginTerminate@0

Сервер сказал плагин работает :D
Можно идти дальше...
Аватара пользователя
~LONSDALE~
Сообщения: 145
Зарегистрирован: 14:38, 09.03.2008
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение ~LONSDALE~ »

Подскажите как в плагине можно запустить форму.Пишу на делфи.
Пишу код:

Код: Выделить всё

Form1.show;
Незапускается ругается на Form1
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

Re: Технология создания плагинов и программ-дополнений

Сообщение VIRUS »

По кусочкам :D .

Код:
.................
interface
uses Windows, Dialogs, Forms;
................
var
dwPluginID : DWORD;
CommFortProcess : TtypeClCommFortProcess;
CommFortGetData : TtypeClGetData;
Form : TForm;
................
function PluginInit(dwThisPluginID : DWORD; plInfo : PPluginInfo; func1 : TtypeClCommFortProcess; func2 : TtypeClGetData) : BYTE;
begin
dwPluginID := dwThisPluginID;

plInfo^.strPluginName := 'Null';
plInfo^.strPluginDescription := 'Test plugin for CommFort client 4.20';
plInfo^.strPluginVersion := '4.20';

CommFortProcess := func1;
CommFortGetData := func2;

Form := TForm.Create(nil);

Form.Height := 100;
Form.Width := 100;


Result := 0;
end;
...........................
procedure PluginShowOptions;
begin
Form.Show;
end;
..........................
function PluginTerminate : BYTE;
begin
Form.Free;

Result := 0;
end;
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Аватара пользователя
-=SJ=-
Сообщения: 246
Зарегистрирован: 02:21, 06.04.2007

Re: Технология создания плагинов и программ-дополнений

Сообщение -=SJ=- »

ИМХО лучше все же так:

Код: Выделить всё

procedure PluginShowOptions;
begin
  Form := TForm.Create(nil);
  if Form.ShowModal = mrOk then
    begin
    ...
    end;
  Form.Free;
end;
1. форма не будет создаваться при каждом запуске плагина (и соответственно висеть в памяти), а только перед вызовом настроек, и сразу после вызова уничтожатся.
2. форму лучше показывать модально т.е. поверх всех окон, и при этом блокируются все окна приложения.
При это не забудьте кнопкам Ok и Cancel присвоить соответствующий ModalResult в инспекторе свойств.
Аватара пользователя
~LONSDALE~
Сообщения: 145
Зарегистрирован: 14:38, 09.03.2008
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение ~LONSDALE~ »

Как можно закрепить эту форму в канале как у плагина"Доски рисования"?
С формой вроде всё разобрался.
Аватара пользователя
-=SJ=-
Сообщения: 246
Зарегистрирован: 02:21, 06.04.2007

Re: Технология создания плагинов и программ-дополнений

Сообщение -=SJ=- »

Для этого я использовал WinApi функции (точнее обертки этих функций реализованные в Delphi);
Чтоб найти нам нужное окно в чате используем FindWindow для главного окна, и FindWindowEx для дочерних окон.
Структуру окон и то что нам надо искать можно посмотреть любым сканером окон (Мне например нравится InqSoft Window Scanner)
Потом нашей форме(Или любому другому контролу у которого Parent обязательно должно быть nil) в свойство ParentWindow присваиваем Хендл найденного окна;
Этого достаточно чтобы "прилипнуть" к нужному нам объекту.

Но на этом проблемы не заканчиваются например нам надо отслеживать когда канал закрывается, изменяет размер, прячется...
Далеко не все Api сообщения будут доходить до нашего окна. Поэтому я использовал хук для перехвата WinАpi сообщений.

Устанавливается нужный нам хук так:

Код: Выделить всё

HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @WndHook, 0, GetCurrentThreadId);
Где WndHook функция вида:

Код: Выделить всё

function WndHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
begin
  ...Наш код...
  Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
Функция CallNextHookEx - должна быть обязательно, она передает сообщение следующему хуку (если он есть), так как неизвестно сколько хуков наставленно.
Например переключатель раскладки клавиатуры в Windows использует хук на нажатия клавиш чтобы перехватывать нужные ему сочетания клавиш.

При дестрое обязательно снимаем хук - UnhookWindowsHookEx(HookHandle)

Ну и напоследок несколько функций которые могут пригодится для работы с чужими окнами:
Чтобы определить размер окна - GetWindowRect(ChannelWindow, Rect)
Чтобы передвинуть окно - MoveWindow(ChannelWindow, Left, Top, Width, Height, True)
Чтобы определить отображается ли окно - IsWindowVisible(ChannelWindow)
Joneg
Сообщения: 11
Зарегистрирован: 10:15, 09.09.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение Joneg »

Подскажите пожалуйсто как сделать чтобы при запуске сервера плагин автоматичски запускался? Не заходить же каждый раз и не включать его?!
Закрыто