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

 
Ответить в эту темуОткрыть новую тему
> window / proc
DarkMaster
сообщение 7.7.2024, 15:42
Сообщение #1


***********

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



Собственно Lua имплементация пилотовских операций с окнами и процессами. Переработана куча костылей, проблем и т.д. Весь код теперь ближе к стилистике lua (возврат nil при ошибке), более логично переработан findwindow, починен windowfrompoint (в базовом виде, для сложных вызовов его функционал перекрывает findwindow), так же возвращает коды ошибок и их текстовое представление.
Следующих два диапазона не представлены в текстовом виде, т.к. в майкрософте видимо кончились цифры и номера этих ошибок соответствуют двум разным причинам. Дабы не вводить в заблуждение возвращается только номер ошибок.
ERROR_INTERNET_* 12000 - 12175 (0x2EE0) См . коды ошибок Интернета и WinInet.h.
ERROR_WINHTTP_* 12001 - 12184 (0x2EE1) См . коды ошибок WinHTTP и Winhttp.h.

Совместимость не 100%, но крайне близка, для облегчения перехода есть таблица с функциями compatibility, которая призвана вызывать новые функции при старом синтаксисе.

Очень большой вопрос, что делать с кодировками. 1251 себя изжила. В ZeroBrane utf8, который нативно не держится luajit, но успешно ковертируется при load, winapi и вовсе хочется utf16. Что делать со всем этим зоопарком мне пока не ясно. Есть идеи к чему и как это все приводить? У меня пока только одна идея - переобъявлять на string метатаблицу newindex и конвертить все это в однобайтовую codepage чтобы иметь полную совместимость с функциями luajit, при этом вроде и крякозябр получится избежать в ZeroBrane. Но степень неправильности данного подхода сложно переоценить. Идеи?

Еще одна очень странная проблема которую пока не понимаю, как решать: showwindow по перехвату api вызовов работает корректно, в пилоте все ок, но в zerobrane шлется все корректно, но в приложение прилетает hide (0) вне зависимости от реального вызова. При том, что в хинте проблемы не было. Подозреваю, что там какой-то хук вешается.

Второй не совсем мне ясный момент:
Код
ffi.cdef[[
        LRESULT SendMessageA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
]]
        -- По неизвестной мне причине требует в явном виде
        -- данную конвертацию не смотря на ffi.cdef.
        -- Подозреваю наличие скрытого cdef в IDE,
        -- которое перезаписывает данное объявление.
        return user32.SendMessageA(ffi.cast("int", handle), message, wparam, ffi.cast("unsigned int", lparam))


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

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

Сообщение отредактировал DarkMaster - 10.7.2024, 20:29


Прикрепленные файлы
Прикрепленный файл  system_error.lua ( 507,41 килобайт ) Кол-во скачиваний: 12
Прикрепленный файл  window.lua ( 66,96 килобайт ) Кол-во скачиваний: 9


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


***********

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



local ext = require[[lua_plugins\extended]]
в шапке удалите.

// Перезалил без этой строки.

Сообщение отредактировал DarkMaster - 7.7.2024, 19:55


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


****

Apprentice
Сообщений: 286
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8884
Пользователь №: 19.451
Возраст: 32



Кодировку думаю utf8 делать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 9.7.2024, 13:18
Сообщение #4


****

Apprentice
Сообщений: 286
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8884
Пользователь №: 19.451
Возраст: 32



result, err, verbose = findwindow(path, [name, [class, [pos, [pid]]]])

result[N].handle - возвращает = uknown data type, првоерял на нескольких приложениях

result = showwinodw([state, [handle]]) - опечатка имени функции

тут видимо тоже
Код
do
    export.compatibility.showwindow = function(handle, state)
        export.compatibility(state, handle)
    end
end

и тут)
result = export.findowindow(nil, nil, nil, nil, target)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.7.2024, 14:34
Сообщение #5


***********

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



Опечатки поправил, спасибо.
Цитата
result[N].handle - возвращает = uknown data type, првоерял на нескольких приложениях

а смотрел чем? Такую чудесную фразу помоему только мой старый принтер пишет. Вообще там cdata, чем являться и должен, старый принтер не делал tostring и просто матерился.
Код
local wnd = export.findwindow("notepad.exe")
ext.lg(wnd)

вывод:
Код
table: 1
    width = 160
    handle = cdata<void *>: 0x0035070c
    y = -32000
    class = "Notepad"
    pid = 5532
    path = "C:\Windows\System32\"
    exe = "notepad.exe"
    tid = 4092
    fullpath = "C:\Windows\System32\notepad.exe"
    name = "Безымянный — Блокнот"
    height = 27
    x = -32000
    Elements in table: 12
Elements in table: 1

Принтер:
Код
local lg = function(data, comment)
    if  comment ~= nil then
        log(comment)
    end

    local tab = ""
    local t = {} -- массив с таблицами, чтобы не уйти в рекурсию.
    local deep = 0

    local function show(data)
        -- Пишем в лог комментарий.
        deep = deep + 1
        if deep > 1 then
            t[_G] = true
        end

        if type(data) == "table"    then
            local element_counter = 0
            if not t[data] then
                t[data] = true
                for k,v in pairs(data) do
                    element_counter = element_counter + 1
                    if  type (v) == "table" then
                        log(tab..'table: '..k)
                        tab = tab .. "    "
                        show(v)
                        tab = string.sub(tab, 1, -5)
                    else
                        if     type(v) == "nil"       then v = "nil"
                        elseif type(v) == "string"    then v = '"' .. v .. '"'
                        elseif type(v) == "number"    then v = tostring(v)
                        elseif type(v) == "function"  then v = tostring(v)
                        elseif type(v) == "thread"    then v = tostring(v)
                        elseif type(v) == "userdata"  then v = tostring(v)
                        elseif type(v) == "boolean"   then v = tostring(v)
                        elseif type(v) == "cdata"     then v = tostring(v)
                        elseif type(v) == "table"     then
                            log(tab..""..k.." = "..v or "nil")
                        else
                            v = "unknown data type"
                        end
                        log(tab..""..k.." = " .. v)
                    end
                end
                log(tab.."".."Elements in table: " .. element_counter)
            else
                if data == _G then
                    log(tab.."".."Table is _G")
                else
                    log(tab.."".."Table already enumerated: " .. tostring(data))
                end
            end
        else
            log('table is "' .. type(data) .. '" data type. Value: ' .. tostring(data))
        end

        --tab = ""
        --deep = 0
    end

    show(data)
end

Напрямую вывоз функции в принтер не помещай, там доп параметры (коды ошибок) прилетят, принтер не оценит.

Цитата
Кодировку думаю utf8 делать.

Куда и как ее делать? Ну в плане я ситуацию обрисовал. luajit utf8 при работе со строками не держит. Как видишь решение? Или я может что-то не понимаю и его можно заставить держать?

Да и забыл. От workwindow() данная либа отказывается в общем виде. Теперь это window и он переменная, а не функция, данные в нем cdata, а не number. Не вижу смысла туда-сюда конвертить и дергать вызов функции, когда нам просто нужно получить значение переменной, ну писать этот вызов неудобно. Тот workwindow, что поставляется в export предназначен в первую очередь для удобства конвертации и не более.

Сообщение отредактировал DarkMaster - 9.7.2024, 14:27


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


****

Apprentice
Сообщений: 286
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8884
Пользователь №: 19.451
Возраст: 32



Смотрел твоим старым принтером, вызов функий на прямую ему не даю.
Новый да, говорит cdata.

С utf8 надо думать.

workwindow / showwindow - как то пока не заставил работать, времени мало позже еще попробую
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.7.2024, 20:30
Сообщение #7


***********

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



обновил window.lua
чуток подправил findwindow чтобы пустой массив вместо nil не возвращал, опечатки.

Сообщение отредактировал DarkMaster - 10.7.2024, 23:42


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

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

 

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