Where im failing on native dll?

Можете показать свой код?
C++
C++:
#include <windows.h>

// Структура, представляющая кадр стека
struct FFrame
{
public:
    int* ftable;        // Указатель на таблицу функций
    void* Node;         // Указатель на узел
    INT* Object;        // Указатель на объект
    INT* Code;          // Указатель на код
    BYTE* Locals;       // Указатель на локальные переменные
    INT LineNum;       // Номер строки
};

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void (__stdcall*Native)(struct FFrame& TheStack, void* const);

// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* const)
{
    Stack.Code++;
   
    // Вывод сообщения о загрузке функции functionUC
   MessageBox(nullptr,  L"Load functionUC 1247", L"hook", MB_OK);
}

// Функция для хука функции в модуле "Core.dll"
void hookCore()
{
    // Получение дескриптора модуля "Core.dll"
    auto hCore = GetModuleHandleA("Core.dll");

    // Проверка, найден ли модуль "Core.dll"
    if (hCore) {
        // Получение адреса функции GRegisterNative из модуля "Core.dll"
        GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");

        // Проверка, найден ли адрес функции GRegisterNative
        if (GRegisterNative_fn) {
         
            // Вызов функции GRegisterNative, передавая в качестве аргументов номер функции (1247) и адрес функции functionUC
            GRegisterNative_fn(1247, &functionUC);
        }
    }
}

// Точка входа для DLL
//extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    // Обработка события, которое указывает на причину вызова функции DllMain
    switch (ul_reason_for_call)
    {
        // Обработка события DLL_PROCESS_ATTACH, которое происходит при загрузке DLL в процесс
    case DLL_PROCESS_ATTACH:
        // Вызов функции hookCore для выполнения хука
        hookCore();
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
UnrealScript
C++:
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
 
Во-первых, у меня еще на этапе регистрации нативок краш из-за
C++:
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);
тут нужно оставить cdecl:
C++:
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

И в структуре ошибки. Почему Code стал INT* ? Вот же правильная структура, которой поделился Test:

C++:
class UObject {};
struct FFrame
{
public:
    int* ftable;
    void* Node;
    UObject* Object; // вот тут INT* Object допустимо
    BYTE* Code; // здесь BYTE* а не INT*
    BYTE* Locals;
    INT    LineNum;
};
 
Допустим мы хотим передать текст из .uc в dll и вывести его как сообщение, как правильно сделать в данном случае?

Лучше наверное полную версию в мануалы добавить чтобы не потерялось если все работает.
 
Спасибо все заработало! Похоже ошибку я допустил с самого начла BYTE* Code; // здесь BYTE* а не INT*, __stdcall я похоже откат сделал и вставил код на форум)
Этот код у меня заработал: c++
C++:
#include <windows.h>
class UObject {};
// Структура, представляющая кадр стека
struct FFrame
{
public:
    int* ftable;        // Указатель на таблицу функций
    void* Node;         // Указатель на узел
    UObject* Object;        // Указатель на объект
    BYTE* Code;          // Указатель на код
    BYTE* Locals;       // Указатель на локальные переменные
    INT LineNum;       // Номер строки
};

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef  void(__stdcall*Native)(struct FFrame& TheStack, void* const);

// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* const)
{
    Stack.Code++;
    
    // Вывод сообщения о загрузке функции functionUC
   MessageBox(nullptr,  L"Load functionUC 1247", L"hook", MB_OK);
}

// Функция для хука функции в модуле "Core.dll"
void hookCore()
{
    // Получение дескриптора модуля "Core.dll"
    auto hCore = GetModuleHandleA("Core.dll");

    // Проверка, найден ли модуль "Core.dll"
    if (hCore) {
        // Получение адреса функции GRegisterNative из модуля "Core.dll"
        GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");

        // Проверка, найден ли адрес функции GRegisterNative
        if (GRegisterNative_fn) {
          
            // Вызов функции GRegisterNative, передавая в качестве аргументов номер функции (1247) и адрес функции functionUC
            GRegisterNative_fn(1247, &functionUC);
        }
    }
}

// Точка входа для DLL
//extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    // Обработка события, которое указывает на причину вызова функции DllMain
    switch (ul_reason_for_call)
    {
        // Обработка события DLL_PROCESS_ATTACH, которое происходит при загрузке DLL в процесс
    case DLL_PROCESS_ATTACH:
        // Вызов функции hookCore для выполнения хука
        hookCore();
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
Unrealscript:
Код:
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
 
Which chronicle are u testing it?
 
Хороший вопрос, тоже интересно. Наверно нужно вытаскивать аргументы из стека. Буду разбираться
Which chronicle are u testing it?
epilogue NA 152
Я просто назвал interface.dll и положил в папку system и игра сама подгрузила ее!
на интерлюде можно l2ui назвать, тоже сама загрузится. На хрониках выше вряд ли работает. Я делаю так:
C++:
__declspec(dllexport) void bind() {};
И потом в cff explorer:

Быстро, просто, удобно
 
Adding only interface.dll on file and logging it opened the game but triggering the native function it gives me this CE


so on other chronicles we inject on engine.dll the hookCore function?
 
Последнее редактирование модератором:
got it thanks, what about sending like a text for UC? on some tutorials from native functions it was supposed to create some kind of Result Variable for it
 
Anyone know how is it possible to receive data from the dll? like on this unrealscript its supposed to return a string but how send this string on dll?

Код:
native(1247) static final function string ItemExSort();

i heard about something related to create a variable named called Result which will have the Data to pass, i tried it with std::string but didnt worked. Maybe need use the FString from unreal?


C++:
void __stdcall functionUC(struct FFrame& Stack, void* const)
{
    Stack.Code++;
    
    //P_FINISH;
    // Вывод сообщения о загрузке функции functionUC
    MessageBox(nullptr, L"Load functionUC 1247", L"hook", MB_OK);

    std::string Result = "Just a test";
}
 
Anyone know how is it possible to receive data from the dll? like on this unrealscript its supposed to return a string but how send this string on dll?

int можно вернуть так, string пока не знаю, и как передать параметры в dll тоже пока не знаю))
C++:
#define RESULT_DECL void*const Result
typedef  void(__stdcall*Native)(struct FFrame& TheStack, RESULT_DECL);
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , RESULT_DECL)
{

    Stack.Code++;
   
// Запишите результат в Result
    *(int*)Result = 2 + 10;

   MessageBox(nullptr,  L"Load functionUC ", L"hook", MB_OK);
 
}
Unrealscript
Код:
native(1247) final function int DllFunction();

AddSystemMessageString("Message"@DllFunction()); //string Вывод системных сообщений в чат
 
AND
i tried it with int, but i receive 0 even if i put any value there, is it normal for you?