Where im failing on native dll?

Да у меня работает возможно вы не весь код скопировали. RESULT_DECL
#define RESULT_DECL void*const Result
i tried with the last code that u sent its like this


C++:
#include <windows.h>
#include "stdafx.h"

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

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

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

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

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

    MessageBox(nullptr, L"Load functionUC ", 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;
}

 
i tried with the last code that u sent its like this

Заменить это

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

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

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

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

    MessageBox(nullptr, L"Load functionUC ", L"hook", MB_OK);
}

На это

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);
 
}
 
i was missing this sorry, i will make the tests again
 
Кто может мне объяснить как это работает?))
В MessageBox я получаю 1000 которая записана в unrealscript в переменной test))
Не могу понять как это вообще сработало?

C++:
int count;

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void

typedef  void(__stdcall* Native)(FFrame&, void*const );

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


// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* Result)
{
Stack.Code++;
// Извлечение результата
int result = *(int*)Result;

// Теперь вы можете использовать *param для получения значения этого параметра
MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK);

  *(int*)Result = count++; //Выводим результат

}


UnrealScript
Код:
native(1247) final function int DllFunction();

   local int test;
 
    test = 1000;
    test = DllFunction();

AddSystemMessageString("Message"@test); //string Вывыод системных сообщений в чат
 
По идее перебираешь стек, как и почему это вопрос к тем кто сделал FFrame.
 
так у тебя возврат идет в test параметр. При вызове функции в параметр Result пишется ссылка на параметр куда идет запись.
 
Пока мне никто не помог с тем как правильно получать данные в dll из скрипта, сделал так, возможно кому-то пригодится.
Это работает так: мы выполняем функцию в скрипт DllCommand(int id); передав число, которое можно получить в dll.
в dll можно сделать switch и например при условие что пришла цифра 2 открыть браузер)

C++:
int count;//Счетчик

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

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

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

// Извлечение результата
int result = *(int*)Result;

// Выведем что пришло из скрипта
MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK);

  *(int*)Result = ++count; //Выводим результат
}

}

UnrealScript
C++:
//Объявим функцию
native(1247) final function int DllFunction();
.......................................................................................................
//Где нибудь в функции вызовем:

//Первый вариант
AddSystemMessageString("Message"@dllCommand(1)); //Отправить в dll число 1 и вернуть результат

//Второй вариант
dllCommand(2); //Просто отправить в dll число 2
.......................................................................................................
//Обработчик вызова
function int DllCommand(int id){
    id = DllFunction();
    return id;
    }

Я примерно понимаю но пока не могу понять как передать получить параметры правильно(
 
параметры извлекаются так же из code. Пример
C++:
struct FFrame
{
public:
    int* ftable;
    void* Node;
    UObject* Object;
    BYTE* Code;
    BYTE* Locals;
    INT    LineNum;

    inline INT ReadInt()
    {
        INT Result;
        Result = *(INT*)Code;
        Code += sizeof(INT);
        return Result;
    }
}
 
параметры извлекаются так же из code. Пример
Буду пробовать изучать спасибо! я просто мало сталкивался с c++

Я проверил ваш код работает но после выполняя зависает Stack.Code++; использую

Test


Заработало использовал 2 раза Stack.Code++; до и после выполнения код

параметры извлекаются так же из code. Пример
Мне кажется я нашел причину и ошибка исчезла теперь Stack.Code++ использую один раз.
Я правильно сделал?
C++:
  Code += sizeof(INT)+1;
 
ReadInt();
В самой функции не корректно сдвигать. Так как у структур параметры идут без переключения до конца. Но в целом можно и так оставить.
 
Что если передать число не 1000, а 1 или 5? У меня фигня какая-то с такими числами
 
Интересно. Видимо какие-то приколы в uc скриптах

C++:
callTestNative( 6666 ); // передается как int
callTestNative( 5 ); // передается как byte

function callNative()
{
    local int testArg;
    testArg = 6666;
    callTestNative( testArg ); // а вот так аргумент вообще не передается
    return;
}
 
Интересно. Видимо какие-то приколы в uc скриптах
Я сделал так как Test предложил, думаю так правильней будет.
В скрипте так: native(1247) final function int DllFunction(int a, int b);
C++:
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

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

    inline INT Param1()
    {
        INT Result;
        Result = *(INT*)Code;
        Code += sizeof(INT) + 1;
        return Result;
    }
    inline INT Param2()
    {
        INT Result;
        Result = *(INT*)Code;
        Code += sizeof(INT) + 1;
        return Result;
    }

};

int countR;

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

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

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

Stack.Code++;

// Извлечение результата
int param1 = Stack.Param1();
// Извлечение результата
int param2 = Stack.Param2();

std::wstring message =  L"\nParam2 " + to_wstring(param2);
MessageBox(nullptr, message.c_str(), L"hook", MB_OK);

  *(int*)Result = countR++; //Выводим результат

}

// Функция для хука функции в модуле "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();
        CreateThread(0, 0, LPTHREAD_START_ROUTINE(hookCore), 0, 0, 0);
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
 
Остался вопрос как передать не int, а текст из uc в dll.

Например жму в интерфейсе кнопку и через dll выскакивает сообщение с текстом из кода uc.
 
Проверил который код дал Test так и есть как ты описал
 
Проверил который код дал Test так и есть как ты описал
Если нельзя будет передать текст из uc в dll, тогда единственный вариант костылить как всегда.

Скорее всего там размер в нативке указан правильно, это мы тут пытаемся сделать кастом.
Хорошо бы посмотреть для чего собственно нужен FFrame.
 
Если нельзя будет передать текст из uc в dll
Это 100% можно сделать. Постараюсь разобраться каким образом, пока что времени на это нет. И сначала мне нужно понять почему в моих скриптах переменные не передаются в нативную функцию
Кстати, нативки в nwindow работают так: сначала сохраняется первый байт из Code, потом Stack.Code++ и далее вызов метода в зависимости от значения первого байта в Code