Страница 29 из 42

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

Добавлено: 18:56, 17.12.2009
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);
это мои догадки, я в этой среде никогда не работал.

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

Добавлено: 19:02, 17.12.2009
Joneg
да хоть вот так:

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

__declspec(dllexport) BYTE __cdecl PluginInit(DWORD, sPluginInfo*, sBotUserInfo*, typeCommFortProcess);
Не в этом дело. Это прототип, на названия переменных тут пофиг.

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

Добавлено: 19:05, 17.12.2009
VIRUS
Ну поверь, я видел случаи, что компиляторы и на такое выдавали ошибку :), правда старые :).

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

Добавлено: 19:07, 17.12.2009
Joneg
Ну может быть наоборот я заблуждаюсь. Но в данном случае компилятор позволяет так делать...
А в билдере значит данный код бы работал?

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

Добавлено: 19:08, 17.12.2009
VIRUS
Могу дать только один совет, поискать на форумах, как правильно работать с DLL в MinGW 3.4.5.

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

Добавлено: 19:11, 17.12.2009
Joneg
Так а почему тогда обращение к функциям то происходит нормально?
Опции\Описание\Инициализация. Функции ведь отрабатывают... MSBBox-ы вылетают.
ДЛЛ-ки не писал никогда... Может чего то и недопонимаю. Почему это работает а это нет...

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

Добавлено: 19:14, 17.12.2009
VIRUS
Joneg писал(а):А в билдере значит данный код бы работал?
Что я исправил да.

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

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

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

Сервер сказал плагин работает :D
Можно идти дальше...

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

Добавлено: 16:20, 26.12.2009
~LONSDALE~
Подскажите как в плагине можно запустить форму.Пишу на делфи.
Пишу код:

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

Form1.show;
Незапускается ругается на Form1

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

Добавлено: 19:21, 26.12.2009
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;

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

Добавлено: 23:50, 26.12.2009
~LONSDALE~
Спосибо,теперь без ошибок

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

Добавлено: 03:20, 28.12.2009
-=SJ=-
ИМХО лучше все же так:

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

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

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

Добавлено: 13:23, 28.12.2009
~LONSDALE~
Как можно закрепить эту форму в канале как у плагина"Доски рисования"?
С формой вроде всё разобрался.

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

Добавлено: 15:17, 29.12.2009
-=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)

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

Добавлено: 22:37, 01.01.2010
Joneg
Подскажите пожалуйсто как сделать чтобы при запуске сервера плагин автоматичски запускался? Не заходить же каждый раз и не включать его?!