
24.11.2024, 15:32
|
|
Постоянный
Регистрация: 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 Вывод системных сообщений в чат
|
|
|

24.11.2024, 15:42
|
|
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами:
9605637
Репутация:
7
|
|
реализовать класс FString. Он имеет не просто массив байт но и размер и важно использовать менеджер памяти клиента для создания/удаления строки.
|
|
|

24.11.2024, 15:44
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от Test
реализовать класс FString. Он имеет не просто массив байт но и размер и важно использовать менеджер памяти клиента для создания/удаления строки.
Могли бы вы привести пример, я пока не понимаю как это работает(
|
|
|

24.11.2024, 15:45
|
|
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами:
9605637
Репутация:
7
|
|
Сообщение от BIT_hack
Могли бы вы привести пример, я пока не понимаю как это работает(
тут уже сами изучайте
|
|
|

24.11.2024, 15:47
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от Test
тут уже сами изучайте
Разве клиент не сам отвечает за освобождение памяти?
|
|
|

24.11.2024, 15:49
|
|
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами:
9605637
Репутация:
7
|
|
Сообщение от BIT_hack
Разве клиент не сам отвечает за освобождение памяти?
у тебя даже по ошибки видно что она идет в освобождении. Чтобы он смог удалить он должен знать о ней.
|
|
|

24.11.2024, 18:02
|
|
Познающий
Регистрация: 08.03.2024
Сообщений: 89
С нами:
1150633
Репутация:
231
|
|
Сообщение от 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
)
;
}
|
|
|

30.11.2024, 13:31
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от Charmant
Fyyre и акуму заливали сдк для грации и интерлюда, там это есть. Точно уже не вспомню чью работу я взял себе (мне нужен был только FString)
Да спасибо помог все работает!
|
|
|

04.12.2024, 15:46
|
|
Познающий
Регистрация: 03.12.2024
Сообщений: 70
С нами:
761919
Репутация:
0
|
|
Сообщение от 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
|
|
|

05.12.2024, 14:55
|
|
Познающий
Регистрация: 08.03.2024
Сообщений: 89
С нами:
1150633
Репутация:
231
|
|
Сообщение от Xtelle
code you used to get pointer to IUManager?
Нужно найти оффсет XMLUIManager в nwindow.dll, он отличается в разных версиях клиента. Дальше всё просто:
C++:
Код:
uintptr_t XMLUIPtrOffset
=
0x1100
;
// gracia epilogue
uintptr_t nwindowBaseAddr
=
0
;
GetXMLUIManager_fn fGetXMLUIManagerPtr
=
nullptr
;
typedef
int
(
__fastcall
*
GetXMLUIManager_fn
)
(
)
;
// nwindowBaseAddr уже получен, !=0
fGetXMLUIManagerPtr
=
(
GetXMLUIManager_fn
)
(
nwindowBaseAddr
+
XMLUIPtrOffset
)
;
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|