Как можно вернуть строку из DLL C++ в UnrealScript, не используя сторонние библиотек?
Я пробую так и еще 1000 способов но постоянно получаю ошибку связанную с FArray
C++ (.*dll)
UnrealScript (.*uc)
Я пробую так и еще 1000 способов но постоянно получаю ошибку связанную с FArray
C++ (.*dll)
C++:
// Класс-заглушка
class UObject {};
// Структура кадра стека UnrealScript
struct FFrame {
int* ftable; // Указатель на таблицу функций
void* Node; // Указатель на узел
UObject* Object; // Указатель на объект
BYTE* Code; // Указатель на код
BYTE* Locals; // Указатель на локальные переменные
INT LineNum; // Номер строки
};
// Тип для нативных функций
typedef void(__stdcall* Native)(FFrame&, void* const);
// Тип для функции регистрации нативных функций в UnrealScript
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
//Функция которая должна вернуть строку в UnrealScript
static void __stdcall GetMyString(struct FFrame& Stack, void* Result) {
const wchar_t* source = L"Hello, world!";
size_t len = wcslen(source) + 1;
// Выделяем память + проверка на ошибку
wchar_t* buffer = (wchar_t*)malloc(len * sizeof(wchar_t));
if (buffer == NULL) {
*((wchar_t**)Result) = NULL;
return;
}
// Используем wcscpy_s
errno_t err = wcscpy_s(buffer, len, source); // len - размер буфера
if (err != 0) {
free(buffer); // Обязательно освободить память в случае ошибки
*((wchar_t**)Result) = NULL;
return;
}
*((wchar_t**)Result) = buffer;
}
// Подключение Core.dll
void hookCore() {
HMODULE hCore = GetModuleHandleA("Core.dll"); // Получение дескриптора Core.dll
// Проверка на успешное получение дескриптора
if (hCore) {
GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");
// Проверка на успешное получение адреса функции
if (GRegisterNative_fn) {
// Регистрация нативных функций в UnrealScript
GRegisterNative_fn(1255, &GetMyString);
}
}
}
// Точка входа DLL
extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
// Отключение отслеживания вызовов функций библиотеки
DisableThreadLibraryCalls(hModule);
hookCore();
}
return TRUE;
}
UnrealScript (.*uc)
C-подобный:
native(1255) final function string GetMyString();
AddSystemMessageString("DLL_TEXT="@GetMyString()); //string Вывод системных сообщений в чат