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

  #2  
Старый 24.11.2024, 15:42
test
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами: 9605637

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

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

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

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

Цитата:
Сообщение от Test  

реализовать класс FString. Он имеет не просто массив байт но и размер и важно использовать менеджер памяти клиента для создания/удаления строки.
Могли бы вы привести пример, я пока не понимаю как это работает(
 
Ответить с цитированием

  #4  
Старый 24.11.2024, 15:45
test
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами: 9605637

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

Цитата:
Сообщение от BIT_hack  

Могли бы вы привести пример, я пока не понимаю как это работает(
тут уже сами изучайте
 
Ответить с цитированием

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

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

Цитата:
Сообщение от Test  

тут уже сами изучайте
Разве клиент не сам отвечает за освобождение памяти?
 
Ответить с цитированием

  #6  
Старый 24.11.2024, 15:49
test
Новичок
Регистрация: 10.02.2008
Сообщений: 1
С нами: 9605637

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

Цитата:
Сообщение от BIT_hack  

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

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

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

Цитата:
Сообщение от Test  

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

  #8  
Старый 24.11.2024, 18:02
Charmant
Познающий
Регистрация: 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
)
;
}
 
Ответить с цитированием

  #9  
Старый 30.11.2024, 13:31
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

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

Цитата:
Сообщение от Charmant  

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

  #10  
Старый 04.12.2024, 15:46
Xtelle
Познающий
Регистрация: 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
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.