ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как вернуть строку из DLL C++ в UnrealScript? (https://forum.antichat.xyz/showthread.php?t=793384)

BIT_hack 24.11.2024 15:32

Как можно вернуть строку из 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 Вывод системных сообщений в чат


test 24.11.2024 15:42

реализовать класс FString. Он имеет не просто массив байт но и размер и важно использовать менеджер памяти клиента для создания/удаления строки.

BIT_hack 24.11.2024 15:44

Цитата:

Сообщение от Test

реализовать класс FString. Он имеет не просто массив байт но и размер и важно использовать менеджер памяти клиента для создания/удаления строки.

Могли бы вы привести пример, я пока не понимаю как это работает(

test 24.11.2024 15:45

Цитата:

Сообщение от BIT_hack

Могли бы вы привести пример, я пока не понимаю как это работает(

тут уже сами изучайте

BIT_hack 24.11.2024 15:47

Цитата:

Сообщение от Test

тут уже сами изучайте

Разве клиент не сам отвечает за освобождение памяти?

test 24.11.2024 15:49

Цитата:

Сообщение от BIT_hack

Разве клиент не сам отвечает за освобождение памяти?

у тебя даже по ошибки видно что она идет в освобождении. Чтобы он смог удалить он должен знать о ней.

BIT_hack 24.11.2024 17:20

Цитата:

Сообщение от Test

у тебя даже по ошибки видно что она идет в освобождении. Чтобы он смог удалить он должен знать о ней.

Хорошо, спасибо, я понял. Буду разбираться. Буду очень признателен, если кто-то сможет дать мне более подробные разъяснения.

Charmant 24.11.2024 18:02

Цитата:

Сообщение от BIT_hack

Могли бы вы привести пример, я пока не понимаю как это работает(

Fyyre и акуму заливали сдк для грации и интерлюда, там это есть. Точно уже не вспомню чью работу я взял себе (мне нужен был только FString)

Цитата:

Сообщение от Спойлер


C++:


Код:

template

struct
TArray
{
friend
struct
FString
;
public
:
inline
TArray
(
)
{
Data
=
nullptr
;
Count
=
Max
=
0
;
}
;
inline
size_t
Num
(
)
const
{
return
Count
;
}
;
inline
T
&
operator
[
]
(
size_t i
)
{
return
Data
[
i
]
;
}
;
inline
const
T
&
operator
[
]
(
size_t i
)
const
{
return
Data
[
i
]
;
}
;
inline
bool
IsValidIndex
(
size_t i
)
const
{
return
i

{
inline
FString
(
)
{
}
FString
(
const
wchar_t
*
other
)
{
Max
=
Count
=
*
other
?
std
::
wcslen
(
other
)
+
1
:
0
;
if
(
Count
)
{
Data
=
const_cast

(
other
)
;
}
}
;
inline
bool
IsValid
(
)
const
{
return
Data
!=
nullptr
;
}
inline
const
wchar_t
*
c_str
(
)
const
{
return
Data
;
}
std
::
string
ToString
(
)
const
{
auto
length
=
std
::
wcslen
(
Data
)
;
std
::
string
str
(
length
,
'\0'
)
;
std
::
use_facet
>
(
std
::
locale
(
)
)
.
narrow
(
Data
,
Data
+
length
,
'?'
,
&
str
[
0
]
)
;
return
str
;
}
}
;


Использую для ивентов так:

C++:


Код:

void
CallExecuteUIEvent
(
int
eventID
,
const
wchar_t
*
strParam
)
{
FString
param
(
strParam
)
;
fExecuteUIEvent
(
fGetXMLUIManagerPtr
(
)
,
eventID
,
&
param
)
;
}


BIT_hack 30.11.2024 13:31

Цитата:

Сообщение от Charmant

Fyyre и акуму заливали сдк для грации и интерлюда, там это есть. Точно уже не вспомню чью работу я взял себе (мне нужен был только FString)

Да спасибо помог все работает!

Xtelle 04.12.2024 15:46

Цитата:

Сообщение от Charmant

Fyyre and akuma were poured with SDK for grace and interlude, there it is. I don't remember exactly whose job I took for myself (I only needed FString)

I use it for events like this:

C++:


Код:

void
CallExecuteUIEvent
(
int
eventID
,
const
wchar_t
*
strParam
)
{
FString
param
(
strParam
)
;
fExecuteUIEvent
(
fGetXMLUIManagerPtr
(
)
,
eventID
,
&
param
)
;
}


Hello Charmant

Can you post here code you used to get pointer to IUManager?

Thank you in advance


Время: 09:23