std::vector lua ffi

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,776
11,226
Версия MoonLoader
.026-beta
Как прочитать std::vector который возвращает вызванная через ffi функция?
 
  • Вау
Реакции: qdIbp
Решение
*** Скрытый текст не может быть процитирован. ***
Попробуй

Lua:
local ffi = require('ffi')

ffi.cdef([[
    struct std_string {
        union {
            char buf[16];
            char* ptr;
        };
        unsigned size;
        unsigned capacity;
    };

    struct stCommandInfo {
        struct std_string name;
        int type;
        void* owner;
    };
    
    struct std_vector_stCommandInfo{
        struct stCommandInfo* first;
        struct stCommandInfo* last;
        struct stCommandInfo* end;
    };
]])

function get_string(from_string)
    if from_string.size <= 0x0F then
        return ffi.string(from_string.buf);
    else
        return ffi.string(from_string.ptr);
    end
end

local SF_getChatCommands =...

RedHolms

Известный
Проверенный
617
360
Могу дать только структуру MSVC'шного вектора, а дальше сам, помочь без кода врятли смогу
C:
struct vector {
    void* first; // Начало буффера
    void* last; // Конец ДАННЫХ в буффере
    void* end; // Конец буффера
}

/*
i.e.

Размер ДАННЫХ вектора, или std::vector::size() = last - first
Вместимость вектора, или std::vector::capacity() = end - first
*/
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,776
11,226
Могу дать только структуру MSVC'шного вектора, а дальше сам, помочь без кода врятли смогу
C:
struct vector {
    void* first; // Начало буффера
    void* last; // Конец ДАННЫХ в буффере
    void* end; // Конец буффера
}

/*
i.e.

Размер ДАННЫХ вектора, или std::vector::size() = last - first
Вместимость вектора, или std::vector::capacity() = end - first
*/
Скрытое содержимое для пользователя(ей): RedHolms
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,733
4,729
*** Скрытый текст не может быть процитирован. ***
Попробуй

Lua:
local ffi = require('ffi')

ffi.cdef([[
    struct std_string {
        union {
            char buf[16];
            char* ptr;
        };
        unsigned size;
        unsigned capacity;
    };

    struct stCommandInfo {
        struct std_string name;
        int type;
        void* owner;
    };
    
    struct std_vector_stCommandInfo{
        struct stCommandInfo* first;
        struct stCommandInfo* last;
        struct stCommandInfo* end;
    };
]])

function get_string(from_string)
    if from_string.size <= 0x0F then
        return ffi.string(from_string.buf);
    else
        return ffi.string(from_string.ptr);
    end
end

local SF_getChatCommands = getModuleProcAddress('SAMPFUNCS.asi', '?getChatCommands@SAMPFUNCS@@QAE?AV?$vector@UstCommandInfo@@V?$allocator@UstCommandInfo@@@std@@@std@@XZ')
local getChatCommands = ffi.cast('struct std_vector_stCommandInfo(__thiscall*)()', SF_getChatCommands)

local commands = getChatCommands()

do
    local it = commands.first
    while it ~= commands.last do
        print(get_string(it[0].name))
        it = it + 1
    end
end