HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 24.11.2024, 15:32
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Как можно вернуть строку из DLL C++ в UnrealScript, не используя сторонние библиотек?

Я пробую так и еще 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 Вывод системных сообщений в чат
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.