Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Plugins
WKnight
сообщение 15.7.2011, 11:40
Сообщение #1


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Подумал на досуге над возможностью использования плагинов, вот что получилось, это типа шаблон-пример.
code

Код

library Plugin;

uses
  Forms; // Формс нужен для TApplication, если не используете, можно убрать и его.

type

  // обмен строковыми данными происходит через структуру, для совместимости с С++

  tInitStruct = packed record
    FunctionName  : Pchar;
  end;

  tParamStruct = packed record
    pWindowHandle : Cardinal;
    pInt1    : Integer;
    pInt2    : Integer;
    pInt3    : Integer;
    pString1 : Pchar;
    pString2 : Pchar;
  end;


var
  DA :  TApplication;
  DS :  TScreen;
  tPS: ^tParamStruct;
  tIS: ^tInitStruct;

// список полезных экспортируемых функций, для сообщения пилоту
const  FunctionNameList: array [0..1] of Pchar = ('Function1','Function2');


function InitPlugin(App, Scr: integer; Ver: Real; Var FunctionCount:

integer):boolean; stdcall;
begin
  Result := false;
  // запомним родные значения, чтоб при выгрузке восстановить
  DS := Screen;
  DA := Application;
  // присвоим значения пилота
  if Scr <> 0 then  Screen      := TScreen(Scr);
  if App <> 0 then  Application := TApplication(App);
  // проверяем версию пилота, если нужно.
  // пилот анализирует возвращаемое значение и выгружает dll, если false
  if Ver >= 2.18 then
    Result := true;
  FunctionCount := 2; // количество полезных экспортируемых функций, для использования в скриптах
end;


procedure DonePlugin; stdcall;
begin
  // восстанавливаем родные значения
  Screen := DS;
  Application := DA;
end;


procedure InfoPlugin(AdressIS: Pointer; Index :cardinal); stdcall;
begin
  // сообщаем пилоту по запросу имя функции. количество экспортируемых передано ранее
  tIS:=AdressIS;
  tIS^.FunctionName:= FunctionNameList[Index];
end;



function Function1(AdressPS: Pointer): boolean; stdcall;
begin
  // единственным параметром передается указатель на структуру, через которую происходит обмен данными
  tPS:=AdressPS;
  if tPS^.pWindowHandle <> 0 then
    tPS^.pString1 := 'Ok'
  else
    tPS^.pString1 := 'eggog';
  Result := true;
  // результат анализируется на предмет успешности завершения функции
end;

function Function2(Adress: Pointer): boolean; stdcall;
begin
  //
  Result := true;
end;


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


Exports
  InitPlugin,
  DonePlugin,
  InfoPlugin,
  Function1,
  Function2;

begin
end.



Сообщение отредактировал DarkMaster - 23.10.2013, 23:25
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 15.7.2011, 14:13
Сообщение #2


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



И шо с этим делать? (IMG:style_emoticons/default/smile.gif)


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 15.7.2011, 14:31
Сообщение #3


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Ето примерный образец плагина, который в скором времени будет поддерживать пилот. Экспортируемые функцие - суть дополнительные команды скрипта (в данном случае Function1 и Function2), с фиксированным числом заранее определенных параметров, часть из которых можно не использовать.
т.е. пилот будет вызывать функцию из плагина с передачей ей указанных параметров. Функция отработав чегото возвращает в скрипт.

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

Смысл таков, что в плагинах вы можете реализовать то, чего вам нехватает в пилоте, но для чего у меня не хватает времени.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 15.7.2011, 17:28
Сообщение #4


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Понятно. Жаль сюда C# легко не прикрутишь, думаю (

Может у тебя получится поисправлять баги, которые изложены в Полезных советах? И доделать немного findcolor? (чтоб можно было использовать переменные при поиске цвета и не нужно было прибавлять смещения угла области поиска)


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 15.7.2011, 18:24
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27737
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 16.7.2011, 7:32
Сообщение #6


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Цитата
Понятно. Жаль сюда C# легко не прикрутишь, думаю (
Что мешает? Я си не знаю, но по совету именно для него сделал передачу параметров не строками и прочим, а указателем на запись определенной структуры.

Баги в ближайшее время врятли, доступ к дебагеру сильно ограничен, а финдколор поковыряю.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 16.7.2011, 15:19
Сообщение #7


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Цитата
доделать немного findcolor? (чтоб не нужно было прибавлять смещения угла области поиска)
тут бы поточнее немного. найденые координаты всегда выдавались относительно прикрепленного окна. сейчас сделал, что если указано abs, то выдаются относительно экрана.

оно кстати в первом способе так и выдавалось...

Сообщение отредактировал WKnight - 16.7.2011, 15:52
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 16.7.2011, 15:55
Сообщение #8


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



в Полезных советах этот баг подробно расписан (даже картинка есть).
координаты возвращались относительно левого верхнего угла указанной области поиска


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.7.2011, 17:27
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27737
Пользователь №: 11.279



Так же необходимо сделать диапазоны, и очень желательно несколько цветов.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 16.7.2011, 17:31
Сообщение #10


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



меня больше интересовали параметры финдколора, а точнее способ поиска и абсолютность координат.

хм, дошло, "области поиска", а не области окна...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 17.7.2011, 9:32
Сообщение #11


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 16.7.2011, 17:27) *

Так же необходимо сделать диапазоны, и очень желательно несколько цветов.

+1000
подчеркну: нужны именно диапазоны по RGB каналам! отдельно по каждому каналу с возможностью объединения.
Например: R(100-200)+G(0-85)+B(200-255)


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 17.7.2011, 10:03
Сообщение #12


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Записал, в этой версии делать не стал, мало ли, опять не успел бы, опять хз на сколько отложилось бы...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.7.2011, 10:14
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27737
Пользователь №: 11.279



Допили, пожалуйста, этот аспект. Это действительно важно.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 30.7.2011, 8:09
Сообщение #14


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Мысли на тему плагинов:
1) при подключении плагина пилот заносит имена всех пользовательских функций в список служебных слов
2) все пользовательские функции после подключения плагина вызываются так:
имя_функции(список параметров)
3) пилот передает все параметры для функции (которые внутри круглых скобок) одной единственной строкой. Уже внутри самой функции должен идти парсинг (разбор) переданной информации и её обработка. Это позволит добиться абсолютной гибкости при вызове пользовательских функций

Как получить информацию назад в пилот - еще не придумал )

JSON


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 10.8.2011, 11:10
Сообщение #15


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Вобщем что мы имеем в настоящий момент.
почитал местные темки, кое-что подправил и получилось оно.
вариант не окончательный, достаточно простой для понимания.
и оно даже работает.
вызываются примерно так
set $a myfirstplugin.Function1 (mnogo mnogo parametrov)
в результате в $a будет содержимое tParamStruct.Result. больше пока никаких махинаций с результатом не делал.

это уже встроено в пилот.

пример плагина
Код
library Plugin;

uses
  Forms; // need for TApplication, if it needed

type
  tInitStruct = packed record
    FunctionCount : Cardinal;
    FunctionNames : Array of Pchar;
  end;

  tParamStruct = packed record
    WindowHandle : Cardinal; // Handle of workWindow
    WindowPID    : Cardinal; // pid of process of workWindow
    Reserved     : Cardinal;
    ParamString     : Pchar; // string of parameters with substituted variables
    ParamStringOrig : Pchar; // original string of parameters
    Result : array [0..32767] of char // array for returned values
  end;

var
  DA :  TApplication;
  DS :  TScreen;
  ParamStruct: ^tParamStruct;  // init by UOPilot
  InitStruct :  tInitStruct;   // init by plagin, free on unload


function InitPlugin(App, Scr: integer; Var Version: Real):Pointer; stdcall;
begin
  // save original values, for restoring on unload
  DS := Screen;
  DA := Application;
  // set UOPilot values for access to
  if Scr <> 0 then  Screen      := TScreen(Scr);
  if App <> 0 then  Application := TApplication(App);
  // проверяем версию пилота, если нужно.
  // пилот анализирует возвращаемое значение и выгружает dll, если false
  if Version >= 2.18 then begin
    // количество полезных экспортируемых функций, для сообщения пилоту
    InitStruct.FunctionCount := 2;
    setlength (InitStruct.FunctionNames, InitStruct.FunctionCount);
    // имена полезных экспортируемых функций
    InitStruct.FunctionNames[0] := 'Function1';
    InitStruct.FunctionNames[1] := 'Function2';
  end else
    InitStruct.FunctionCount := 0;

  Result := @InitStruct;
end;


procedure DonePlugin; stdcall;
begin
  // подчистим
  setlength (InitStruct.FunctionNames, 0);
  // восстанавливаем родные значения
  Screen := DS;
  Application := DA;
end;


// пример полезной функции
function Function1(AdressPS: Pointer): boolean; stdcall;
begin
  // единственным параметром передается указатель на структуру, через которую происходит обмен данными
  ParamStruct := AdressPS;
  if ParamStruct^.WindowHandle <> 0 then
    ParamStruct^.Result := 'Ok' +#0
  else
    ParamStruct^.Result := 'eggog' +#0;
  // результат анализируется на предмет успешности завершения функции
  Result := true;
end;

function Function2(AdressPS: Pointer): boolean; stdcall;
begin
  Result := true;
end;


Exports
  InitPlugin,
  DonePlugin,
  Function1,
  Function2;

begin
end.


Сообщение отредактировал WKnight - 10.8.2011, 11:13
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 10.8.2011, 12:53
Сообщение #16


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Встроено в версию 2.20 ?

Какие требования к наименованию и размещению dll ?


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.8.2011, 13:47
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27737
Пользователь №: 11.279



Цитата
set $a myfirstplugin.Function1 (mnogo mnogo parametrov)

Может сразу сделать поддержку возврата сразу нескольких параметров? А то предвижу большие грабли... Возможно в массив...

Сообщение отредактировал DarkMaster - 10.8.2011, 13:49


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 10.8.2011, 14:16
Сообщение #18


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 10.8.2011, 13:47) *

Может сразу сделать поддержку возврата сразу нескольких параметров? А то предвижу большие грабли... Возможно в массив...

а кто мешает отдельные слова из строки выковырять?


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.8.2011, 14:32
Сообщение #19


***********

Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27737
Пользователь №: 11.279



Средствами пилота? Сколько работал с текстом в пилоте столько матерился...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 10.8.2011, 15:11
Сообщение #20


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 10.8.2011, 14:32) *

Средствами пилота? Сколько работал с текстом в пилоте столько матерился...

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


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.4.2024, 4:00
Designed by Nickostyle