Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ Вопросы по разработке.

Автор: DarkMaster 27.5.2016, 13:29

Cockney, ты использовал новый интерфейс плагинов с передачей результата по указателю? У меня пустоту возвращает хоть убей. Причем структуру создаю, все назначаю, старый вариант по всей цепочке указателей значение считывает нормально:

Код
     sprintf_s(ParamStruct->Result,
        "%u     " "%u     " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
        );

Но как только я ствалю:
Код
ResultStruct.used = true;

пустота приходит.

Автор: Cockney 27.5.2016, 18:30

Игрался. Было раз такое, но это я с адресами тупил. сяду за комп - напишу код.

Автор: DarkMaster 27.5.2016, 18:43

С адресами я тоже тупил. Точнее я думал структуру создаст пилот, а мне ее надо только принять, соответственно писал сначала в молоко и понять ничего не мог. Но сейчас вроде как все нормально сделано...

Код
include <stdexcept>

using namespace std;

struct tInitStruct
{
    long unsigned FunctionCount;
    const char** FunctionNames;
};


struct tResultStruct // Заполняется плагином. Память под строку выделяется и освобождается плагином.
{
    bool used;   // Используется ли эта структура при возврате значения. = false
    unsigned int RLength;  // Размер данных.
    char *RArray;     // Указатель на возвращаемую строку.
    unsigned int Reserved1;
    unsigned int Reserved2;
    unsigned __int64 Reserved3;
    unsigned __int64 Reserved4;
};
tResultStruct ResultStruct;



struct tParamStruct
{
    int unsigned* WindowHandle; // Handle of workWindow
    int unsigned* WindowPID; // pid of process of workWindow
    tResultStruct *pResultStruct;
    char* ParamString; // string of parameters with substituted variables
    char* ParamStringOrig; // original string of parameters
    char Result[32767]; // array for returned values
};


tParamStruct *ParamStruct;       // init by UOPilot
static tInitStruct InitStruct;   // init by plugin, free on unload


extern "C" __declspec(dllexport) unsigned long * __stdcall InitPlugin(int App, int Scr, double& Version)
{
    // Количество полезных экспортируемых функций для сообщения пилоту
    // в зависимости от версии протокола обмена между пилотом и плагином.
    // Это НЕ версия самого пилота, а версия протокола обмена между пилотом и длл.
    if (Version >= 2.18)
    {
        InitStruct.FunctionCount = 2;
        InitStruct.FunctionNames = new const char*[InitStruct.FunctionCount];
        InitStruct.FunctionNames[0] = "Function1";
        InitStruct.FunctionNames[1] = "Function2";
    }
    else
    {
        InitStruct.FunctionCount = 0; // Выгурзит длл, т.к. функций для экспорта нет.
    }
    return (&InitStruct.FunctionCount);
}


static char message[] = "123\0";
// Образец функции возвращающей строку.
extern "C" __declspec(dllexport) void __stdcall Function2(tParamStruct *ParamStruct)
{
        // Так работает по старой схеме:
    ResultStruct.RArray = message;
    ResultStruct.RLength = 4;
    ParamStruct->pResultStruct = &ResultStruct;
    sprintf_s(ParamStruct->Result,
             "%u     " "%u     " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
             );

        // Вот так пустоту возвращает:
    ResultStruct.used = true;
    ResultStruct.RArray = message;
    ResultStruct.RLength = 4;
    ParamStruct->pResultStruct = &ResultStruct;
}



Т.е. у тебя на практике реально новым методом данные возвращались?


Прикрепленные файлы
Прикрепленный файл  socket.7z ( 13,13 килобайт ) Кол-во скачиваний: 1548
Прикрепленный файл  msvcp120d.7z ( 150,41 килобайт ) Кол-во скачиваний: 1413
Прикрепленный файл  msvcr120d.7z ( 446,96 килобайт ) Кол-во скачиваний: 1422
Прикрепленный файл  socket2.7z ( 13,14 килобайт ) Кол-во скачиваний: 1445
Прикрепленный файл  socket3.7z ( 13,35 килобайт ) Кол-во скачиваний: 1422
Прикрепленный файл  socket4.7z ( 13,35 килобайт ) Кол-во скачиваний: 1527
Прикрепленный файл  socket5.7z ( 13,37 килобайт ) Кол-во скачиваний: 1541

Автор: Cockney 27.5.2016, 18:51

Да.

А если так ? я не знаю, есть ли разница, но....

ParamStruct->pResultStruct = int(&ResultStruct);

т.к. в ParamStruct адрес данных идет в reserved, который является cardinal(в сях наверно int, или аналог), а ты адрес суешь сразу.

Вроде по размеру как бы совпадает, но то адрес прямой, а то число, хотя хз как там в си.

Автор: DarkMaster 27.5.2016, 19:03

reserved был заменен на tResultStruct *pResultStruct;
Т.е. там натуральный указатель.

Цитата
ParamStruct->pResultStruct = int(&ResultStruct);

Фишка в том, что указатель там присвоен и он корректный, т.к.:
ParamStruct->pResultStruct->RArray
Содержит корректные данные...

Автор: Cockney 27.5.2016, 19:09

Он корректный, да, ты же знаешь, что он там находится, и считываешь с него. А вот пилот, думаю, не знает, и пытается ЧИСЛО привести к АДРЕСУ. А выходит, что он непонятные данные приводит к чему-то. Ну имхо. Попробуй с исходным reserved. и приведи адрес к инту. не упрощай с лету все.

Автор: DarkMaster 27.5.2016, 19:19

дык адрес это и есть unsigned int. Он хранится как беззнаковое 4 байта, т.е. unsigned int. Запись указателя в инт на самом деле это не очень правильно. Т.е. компилятор скажет, что я не прав и нужно приведение, либо, как обычно и делается, сказать компилятору, что данные на самом деле нужного типа(int)pointer.
Кардинал это беззнаковый 4 байта?

Чет я в этой запаре уже пальцы заплетаются. Не крашит - пустоту возвращает.

Автор: Cockney 27.5.2016, 19:26

Да.

Ты пробовал, как я писал?

Автор: DarkMaster 27.5.2016, 19:34

Да, сейчас как раз сижу. Так же попробовал сделать ошибку записав адрес в знаковый инт - результат тот же.

Причем пустота возвращается какая-то странная. chrtohex пишет, что там вроде как пусто, но если сделать:
log $var
то в лог не будет выведена даже пустая строка.

Автор: DarkMaster 27.5.2016, 19:47

Дай работающий пример. Чет у меня такое чувство, что там указатель как-то криво хранится...

Автор: Cockney 27.5.2016, 20:09

чуть позже будет.

Автор: DarkMaster 27.5.2016, 20:36

кстати на:
ResultStruct.used = true;
реакция идет корректная, т.е. пилот получается все-таки видит структуру с результатом...

Автор: Cockney 27.5.2016, 20:56

а почему он должен ее не видеть?

Автор: Cockney 27.5.2016, 21:11

Код
tResultStruct = packed record // Заполняется плагином. Память под строку выделяется и освобождается плагином.
    used          : boolean;   // Используется ли эта структура при возврате значения. = false
    RLength       : Cardinal;  // Размер данных. ТИП НЕ МЕНЯЮ                                       = 0
    RArray        : Pchar;     // Указатель на возвращаемую строку.                    = ''
    Reserved1     : Cardinal;
    Reserved2     : Cardinal;
    Reserved3     : Int64;
    Reserved4     : Int64;
  end;


Код
z : tResultStruct; //глобально


в инит плагине :
Код

//заполним данные
    z.RArray := 'f';
    z.RLength := Length(z.RArray);

вызов
Код
вызов


ParamStruct := AdressPS;
  //адрес структуры приведем к инт
  ParamStruct^.Reserved := Integer(@z);
  z.used := True;
  // return value not analized while, may be later
  Result := true;


Код
21:13:07 4 (autosaved_4.txt, 1): f

Автор: DarkMaster 27.5.2016, 21:25

Потому что не видит результат, как следствие у нас возникли вопросы видит ли он вообще структуру. Вопрос решен. Точнее причина найдена, решение ищу... Bool 4 байта... byte, char, char[1] тоже по 4 байта. Отсюда все и съезжает.

Решение(вроде только под MSVS):

Код
#pragma pack(push, 1)
struct tResultStruct // Заполняется плагином. Память под строку выделяется и освобождается плагином.
{
    bool used;   // Используется ли эта структура при возврате значения. = false
    unsigned int RLength;  // Размер данных.
    char *RArray;     // Указатель на возвращаемую строку.
    unsigned int Reserved1;
    unsigned int Reserved2;
    unsigned __int64 Reserved3;
    unsigned __int64 Reserved4;
};
#pragma pack(pop)

Так же есть ключ компилятора: /Zp.

Автор: TemTriss 8.6.2016, 18:03

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

Автор: DarkMaster 8.6.2016, 18:11

Это не решается плагином.

Автор: TemTriss 8.6.2016, 18:19

Цитата(DarkMaster @ 8.6.2016, 18:11) *

Это не решается плагином.

Может подскажите а есть ли другие варианты?
P.s. сори за офтоп.

Автор: Cockney 8.6.2016, 18:25

Нет. Нету.

Автор: Aimed 8.6.2016, 22:02

Цитата(TemTriss @ 8.6.2016, 17:03) *

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


http://www.cnet.com/how-to/how-to-encrypt-selected-text-and-entire-text-files-with-notepad/

Автор: DarkMaster 8.6.2016, 23:23

И? А как ты пилот заставишь потом понимать эти шифрованные скрипты?

Автор: Aimed 9.6.2016, 8:27

Цитата(DarkMaster @ 8.6.2016, 22:23) *

И? А как ты пилот заставишь потом понимать эти шифрованные скрипты?


Причем тут пилот? Автор хочет зашифровать и выложить данные, которые являются скриптами для пилота.
Вот, пожалуйста. Зашифровал, выложил, а потом можешь смело ключики раздавать тем кому можно пользоваться скриптом, им только расшифровать и скопировать в пилот уже нормальные данные.
Рабочая альтернатива плагину которого нету и который не нужен.
Или я что-то не так говорю?

Автор: Cockney 9.6.2016, 9:44

Что мешает один раз кому-то купить и раздать всем? Да и не факт, что вообще покупать придется. Грош цена такому шифрованию.
------

А я предлагал дать возможность дергать функции пилота из плагина. Тут и проблема бы с долгожданной компиляцией решилась. И скоростью работы, кстати.

Автор: DarkMaster 9.6.2016, 10:13

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

Автор: TemTriss 16.6.2016, 12:38

Цитата(Cockney @ 9.6.2016, 9:44) *

А я предлагал дать возможность дергать функции пилота из плагина. Тут и проблема бы с долгожданной компиляцией решилась. И скоростью работы, кстати.

Да, действительно это был бы лучший вариант. Но как я понимаю это не реализовано и в планы реализации не входит?)

Автор: Cockney 16.6.2016, 13:15

да

Автор: WKnight 16.6.2016, 14:49

В планы реализации входит.

Туда много чего входит, выходит оттуда мало smile.gif

Автор: Cockney 16.6.2016, 18:09

Цитата(WKnight @ 16.6.2016, 15:49) *

В планы реализации входит.



Что именно входит? Компиляция, шифрование или апи?

Автор: WKnight 16.6.2016, 22:32

Вообще, всё из перечисленного, но подозреваю, что апи реальней увидеть в обозримом будущем. Тут многое от ДаркМастера зависит smile.gif

Автор: DarkMaster 17.6.2016, 9:44

Цитата
Тут многое от ДаркМастера зависит smile.gif

О.о

Автор: Cockney 17.6.2016, 15:26

Цитата(DarkMaster @ 17.6.2016, 9:44) *

О.о



Да-да,не подведи,вся надежда на тебя)

Автор: DarkMaster 17.6.2016, 17:58

Мне бы еще понять причем тут я и, что от меня хотят...

Темку солью с разработкой плагинов - не теряйте.

Автор: Cockney 18.6.2016, 15:35

Кнайта пинать.

Автор: WKnight 18.6.2016, 16:28

laugh.gif

Автор: Cockney 11.7.2016, 13:07

Скрипт :

Код
set logging clear
set logging mode fulltime
set logging begin
set $a FilesAPI.OpenFile (*z.zip* *Read*)
msg $a //вывод хендла файла(первый проход нормально выводит, второй выводит %b)
set %b FilesAPI.ReadArrayOfByte (* $a * *1000*) //в %b будет массив байт
set $a FilesAPI.CloseFile (* $a *)
msg $a //вывод результата закрытия файла(вместо 1 или 0 выводит %b)
//первый прогон скрипта выдаст 1000 элементов, т.е. сколько и указано было при чтении
//второй выдаст на 1 элемент меньше и первый элемент некорректный
for #n 1 size(%b[1])
    set logging %b[1 #n]
end_for
set logging end
set logging size(%b[1])
end_script


При выполнении в 32 происходят вещи, описанные в комментах. Порой выдает ApplicationError с инфой, о том, что неверный дескриптор окна, а так же AV при чтении нулевого адреса.

Размер возвращаемых данных не больше 32кб(если брать 1000 элементов, то размер данных около 4 кб).

Плагин использует протокол 2.18 (как я понял).

В 36(33-35 не нашел где скачать) и выше все нормально работает.

Что это?

Плагин прикладываю Прикрепленный файл  FilesAPI.zip ( 31,25 килобайт ) Кол-во скачиваний: 1252

Автор: Cockney 12.7.2016, 22:10

в 2.35 тоже самое.



Где брать 2.33 и другие старые версии?

Автор: DarkMaster 13.7.2016, 3:11

вообще на сайте они есть. ну и я залить могу.

Автор: Cockney 13.7.2016, 11:03

в старых версиях нет. упоминание есть, а скачать нельзя.

Автор: DarkMaster 13.7.2016, 11:19

Все прекрасно качается с сайта. Обновил репозиторий в теме полезных советов из личного склада. 2.36 (базовую, не .1 .2) скачал с сайта и прилепил туда же.

Автор: Cockney 13.7.2016, 11:21

ссылку сайта тогда можно?

Автор: DarkMaster 13.7.2016, 11:23

http://uopilot.uokit.com/
тыкаем old version тыкам на номер версии.

Автор: Cockney 13.7.2016, 11:26

33 недоступен. как и многие другие

Автор: DarkMaster 13.7.2016, 11:32

Хм... Странно.
https://redmine.uokit.com/projects/uopilot/issues )

Автор: Cockney 13.7.2016, 11:33

Чего? написать репорт?

Автор: DarkMaster 13.7.2016, 11:37

Чиркани =) Ну или я чиркану...

Автор: DarkMaster 13.7.2016, 13:56

версии все нужные в полезных советах есть? могу еще что-нибудь залить)

Автор: Cockney 13.7.2016, 14:27

В советах только ссылка на самую новую. Истории не увидел. Она где то в постах, а не в шапке?

Автор: WKnight 13.7.2016, 15:07

Добавил несколько ссылок на старые версии на хомпейдже. Русская и английская версии странички слегка отличаются в этом плане. 2,33 отключена умышленно, зачем - не помню. Включать не стал.

Автор: Cockney 13.7.2016, 16:10

в чем прикол? и где теперь его брать?

Автор: DarkMaster 13.7.2016, 16:13

скорее всего проблема из-за гугла с его паническими атаками на вирусню. Взять можно в соседней теме "полезные советы". Я бы рекомендовал запаковать пилот в запароленный архив и все-таки выложить.

Автор: Kortez 16.9.2017, 21:12

Приветствую, есть некоторые вопросы по плагинам:

- как передать в плагин массив?

пример скрипта:

Код

set #n 20
set $s "foo bar"
init_arr %arr 10 20 30

log UOPilotPlugin.Function1(#n, $s, %arr)
stop_script


результат: (плаг сделан на основе из справки)

21:04:02 2 (autosaved_2.txt, 6): (Handle 0; PID 0; Parameter string (20, foo bar, %arr); Parameter string original (20, foo bar, %arr)

как видим, содержимое массива не парсится

- откуда взялась первая открывающая скобка "(" в выводе плага, если в шаблоне ее нет?

код функции:

Код
void UOPILOT_CALL Function1(tParamStruct* ParamStruct)
{
    sprintf_s(ParamStruct->Result,
        "%s" "%u" "%s" "%u" "%s" "%s" "%s" "%s",
        "Handle ", (size_t) ParamStruct->WindowHandle,
        "; PID ", (size_t) ParamStruct->WindowPID,
        "; Parameter string ", ParamStruct->ParamString,
        "; Parameter string original ", ParamStruct->ParamStringOrig
    );
}

- как вызывать плагин из lua?

переписанный скрипт:

Код
--lua
log("clear")

local n = 20
local s = "foo bar"
local arr = {10,20,30}

log(UOPilotPlugin.Function1(n, s, arr))
stop_script()


лог:

21:08:20 1 (autosaved_1.txt, 0): (-1): Ошибка! Проверьте правильность скрипта! ELuaScript unit "GLOBAL_NAME_SPACE", line 7.
Global variable "UOPilotPlugin" not found
--lua
log("clear")

local n = 20
local s = "foo bar"
local arr = {10,20,30}

log(UOPilotPlugin.Function1(n, s, arr

Автор: Cockney 16.9.2017, 21:21

Массив вроде можно передать как %a[1]

Автор: DarkMaster 17.9.2017, 6:35

Цитата
как вызывать плагин из lua?

У луа есть собственные требования к функциям для импорта. Нужно смотреть именно луа доки, если есть желание подключать в луа синтаксисе. Возможно будет проще сделать длл чисто под луа и ее прикрутить через require (в старом пилотном синтаксисе такая функция будет недоступна).

Автор: Kortez 23.9.2017, 17:59

Цитата(Cockney @ 16.9.2017, 21:21) *

Массив вроде можно передать как %a[1]


так можно, но при этом передается только первый элемент

из скрипта пилота можно передавать в плагин параметры по ссылки (или адрес) чтобы плаг мог изменять переданное значение?

Вопрос уже более риторический, ибо с появлением луа я все больше подумываю перейти на него

пока это затруднительно ввиду различного рода багов при вызове функций пилота

из недавнего:

set #h1 GetWindow (#h, Child)

по данным Spy++, аналогичный вызов в lua возвращает левый хэндл:

local w = tonumber(findwindow("BlueStacks")[1][1])
w = getwindow(w, "Child")

--

вызов скрипта

get windowpos 0 #x #y #w #h

как оно будет в lua?
вариант
local x, y, w, h
local r = windowpos(0, x, y, w, h)

не прокатывает


Автор: cirus 23.9.2017, 19:07

Цитата
local w = tonumber(findwindow("BlueStacks")[1][1])
w = getwindow(w, "Child")

Код
--lua
local w = findwindow("BlueStacks") -- ищем окно BlueStacks
if (w[1]) then  -- если найдено
    log (w[1][1])
    local childhandle = getwindow(w[1][1], "Child")
    log (childhandle)
end

Цитата
get windowpos 0 #x #y #w #h
как оно будет в lua?

Не работает пока Кнайт не поправит.

Автор: DarkMaster 23.9.2017, 22:16

Цитата
get windowpos 0 #x #y #w #h

как оно будет в lua?
вариант
local x, y, w, h
local r = windowpos(0, x, y, w, h)

не прокатывает

Цитата
Не работает пока Кнайт не поправит.

Главное чтобы на костре не сожгли:
Код
get ("windowpos workwindow #x #y #w #h")
x, y, w, h = "#x", "#y", "#w", "#h"
log (x, y, w, h)

Автор: WKnight 12.10.2017, 13:56

build 12
Починил 'get windowpos' в Lua. Теперь работает как функция 'x, y, width, height, errorcode = windowpos (<handle>)'.

// пока не опубликовано.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)