
18.01.2023, 23:07
|
|
Постоянный
Регистрация: 01.05.2021
Сообщений: 752
С нами:
2650753
Репутация:
98
|
|
Пытаюсь вызвать функцию из 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
)
;
}
)
;
|
|
|

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
)
;
}
)
;
|
|
|

23.01.2023, 22:26
|
|
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами:
3831395
Репутация:
183
|
|
Как можно получить ID процесса по его названию? Нашел такую функцию в интернете:
Сообщение от Спойлер
C++:
Код:
DWORD
GetProcessID
(
const
char
*
processName
)
{
if
(
!
processName
)
return
0
;
DWORD id
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
)
{
PROCESSENTRY32 pe32
=
{
sizeof
(
PROCESSENTRY32
)
}
;
if
(
Process32First
(
hSnap
,
&
pe32
)
)
{
while
(
Process32Next
(
hSnap
,
&
pe32
)
)
{
if
(
strcmp
(
processName
,
pe32
.
szExeFile
)
==
0
)
{
id
=
pe32
.
th32ProcessID
;
break
;
}
}
}
}
CloseHandle
(
hSnap
)
;
return
id
;
}
Но она выдает ошибку:
1674498319091.pngARMOR · 23 Янв 2023 в 21:26' data-fancybox="lb-post-1242938" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/187046/" style="cursor: pointer;" title="1674498319091.png">

|
|
|

23.01.2023, 22:29
|
|
Познавший АНТИЧАТ
Регистрация: 18.09.2017
Сообщений: 1,044
С нами:
4553429
Репутация:
153
|
|
Сообщение от armor
Как можно получить ID процесса по его названию? Нашел такую функцию в интернете:
Сообщение от Спойлер
C++:
Код:
DWORD
GetProcessID
(
const
char
*
processName
)
{
if
(
!
processName
)
return
0
;
DWORD id
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
)
{
PROCESSENTRY32 pe32
=
{
sizeof
(
PROCESSENTRY32
)
}
;
if
(
Process32First
(
hSnap
,
&
pe32
)
)
{
while
(
Process32Next
(
hSnap
,
&
pe32
)
)
{
if
(
strcmp
(
processName
,
pe32
.
szExeFile
)
==
0
)
{
id
=
pe32
.
th32ProcessID
;
break
;
}
}
}
}
CloseHandle
(
hSnap
)
;
return
id
;
}
Но она выдает ошибку:
В настройках проекта выбери - многобайтовую кодировку.
|
|
|

23.01.2023, 22:27
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Поставь компиляцию строк в мультибайте, а не в unicode
|
|
|

26.01.2023, 14:13
|
|
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами:
1895177
Репутация:
3
|
|
Как можно вызвать функции из libsamp.so или libgtasa.so на samp mobile? Я в этом мало знаю, как это можно сделать? (К примеру вывод текста в чат)
|
|
|

29.01.2023, 17:29
|
|
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами:
1895177
Репутация:
3
|
|
Помогите, компилю, но текст не выводится (делаю на самп мобайл)
Код:
Код:
#include "main.h"
#include "armhook.h"
void AddMessageJumpQ(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))(g_libGTASA+0x4D1EA4))(text, time, flag, bPreviousBrief);
}
void InitializeAndLoad() {
while (*reinterpret_cast(g_libGTASA+0x9E75B8) != 9) {
std::this_thread::sleep_for(std::chrono::milliseconds(100u));
}
AddMessageJumpQ("~r~Hello from blast.hk", 5000, 0, false);
}
|
|
|

06.02.2023, 06:05
|
|
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами:
2276608
Репутация:
8
|
|
Есть какой либо сорц по смени имени окна уже после подключения к серверу либо инициализации плагина?По типу такого:

Может кто то, что нибудь подсказать?
|
|
|

06.02.2023, 13:29
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
Сообщение от writeline
Есть какой либо сорц по смени имени окна уже после подключения к серверу либо инициализации плагина?По типу такого:

Может кто то, что нибудь подсказать?
SetWindowText(handle, "Заголовок");
|
|
|

06.02.2023, 22:58
|
|
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами:
2276608
Репутация:
8
|
|
Сообщение от AdCKuY_DpO4uLa
SetWindowText(handle, "Заголовок");
Подскажи если сможешь, почему не хочет работать? 🧐
C++:
Код:
void
windtext
(
)
{
HWND hwnd
=
FindWindow
(
NULL
,
"GTA:SA:MP"
)
;
if
(
hwnd
==
NULL
)
{
MessageBox
(
NULL
,
"Window not found!"
,
"Error"
,
MB_OK
)
;
}
std
::
string newText
=
"GTA:BLAST.HK"
;
SetWindowText
(
hwnd
,
newText
.
c_str
(
)
)
;
}
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|