|
Plugins |
|
|
WKnight |
15.7.2011, 11:40
|
Разработчик 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
|
|
|
|
Zeleax |
15.7.2011, 14:13
|
ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010 Группа: Пользователи Наличность: 0 Из: Киев
Пользователь №: 13.093
|
--------------------
|
|
|
|
WKnight |
15.7.2011, 14:31
|
Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006 Группа: Пользователи Наличность: 0
Пользователь №: 4.688
|
Ето примерный образец плагина, который в скором времени будет поддерживать пилот. Экспортируемые функцие - суть дополнительные команды скрипта (в данном случае Function1 и Function2), с фиксированным числом заранее определенных параметров, часть из которых можно не использовать. т.е. пилот будет вызывать функцию из плагина с передачей ей указанных параметров. Функция отработав чегото возвращает в скрипт.
Вариант предварительный, не обкатаный, но рабочий. Пакладен для обсуждения и выяснения чего нужно в нем изменить для всеобщего удобства. Я плагинов раньше не писал, поэтому хз чего им надо от основной программы.
Смысл таков, что в плагинах вы можете реализовать то, чего вам нехватает в пилоте, но для чего у меня не хватает времени.
|
|
|
|
WKnight |
10.8.2011, 11:10
|
Разработчик 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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|