
19.01.2023, 02:56
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от Yuriy Code
Пытаюсь вызвать функцию из samp.dll, но крашит. Что не так?
C++:
Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
int
(
__stdcall
*
)
(
const
char
*
a1
,
int
a2
,
int
a3
)
;
func_type func
=
reinterpret_cast
(
(
DWORD
)
(
GetModuleHandle
(
"samp.dll"
)
+
0x9C2C0
)
)
;
func
(
"Func called"
,
0x3E8
,
5
)
;
}
)
;
В оригинале там
, и сигнатура выглядит вот так:
Код:
void __thiscall sub_A05D0(CGame *this, char *text, int duration, int style)
Но CGame можно опустить, потому что он не используется. Короче тебе просто повезло.
А ошибка в том, что ты прибавляешь к результату GetModuleHandle число напрямую. А под ним лежит указатель, поэтому прибавляется неверное количество байт. Правильно будет вот так:
C++:
Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
void
(
__stdcall
*
)
(
const
char
*
,
int
,
int
)
;
auto
sampbase
=
reinterpret_cast
(
GetModuleHandle
(
"samp.dll"
)
)
;
func_type func
=
reinterpret_cast
(
sampbase
+
0x9C2C0
)
;
func
(
"Func called"
,
1000
,
5
)
;
}
)
;
А еще правильнее вот так:
C++:
Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
void
(
__thiscall
*
)
(
void
*
,
const
char
*
,
int
,
int
)
;
auto
sampbase
=
reinterpret_cast
(
GetModuleHandle
(
"samp.dll"
)
)
;
func_type func
=
reinterpret_cast
(
sampbase
+
0x9C2C0
)
;
func
(
*
reinterpet_cast
(
sampbase
+
/* R3 Addr: 0x26E8F4 */
)
,
"Func called"
,
1000
,
5
)
;
}
)
;
|
|
|