HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #5031  
Старый 13.01.2021, 22:39
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

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

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

не нахожу, можешь ткнуть пальцем пожалуйста
C++:





Код:
void
__stdcall
dest
(
)
{
}
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
dest
)
;
//init
 
Ответить с цитированием

  #5032  
Старый 14.01.2021, 01:49
ishi
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами: 6483143

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

Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:

Код:





Код:
результатом вычисления фрагмента не является функция, принимающая 4 аргументов


Вот, что я пытался ему впарить:

C++:





Код:
class
user32
{
char
*
base_address
;
template

void
call
(
function func
,
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
func
(
a
,
b
,
c
,
d
)
(
)
;
}
public
:
user32
(
)
{
base_address
=
(
char
*
)
GetModuleHandleA
(
"user32.dll"
)
;
}
void
MessageBoxA
(
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
call
(
(
base_address
+
0x77B30
)
,
a
,
b
,
c
,
d
)
;
}
}
;


Копаясь в интернете, я понял, что можно как-то сделать, чтобы функция объявлялась как обычная статическая и перекидывала аргументы через fastcall, stdcall и т.д., типа ты её объявил в переменной, но аргументы перекинул как в статическую и всё на ок сработало, но в тех громоздких конструкциях я так и не нашёл минималистичного примера, который смог бы понять. Всё как-то слишком уж перегружено

Отчаянно нуждаюсь в помощи в понимании этого механизма

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

  #5033  
Старый 14.01.2021, 04:39
memir
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами: 5646349

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

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

Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:

Код:





Код:
результатом вычисления фрагмента не является функция, принимающая 4 аргументов


Вот, что я пытался ему впарить:

C++:





Код:
class
user32
{
char
*
base_address
;
template

void
call
(
function func
,
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
func
(
a
,
b
,
c
,
d
)
(
)
;
}
public
:
user32
(
)
{
base_address
=
(
char
*
)
GetModuleHandleA
(
"user32.dll"
)
;
}
void
MessageBoxA
(
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
call
(
(
base_address
+
0x77B30
)
,
a
,
b
,
c
,
d
)
;
}
}
;


Копаясь в интернете, я понял, что можно как-то сделать, чтобы функция объявлялась как обычная статическая и перекидывала аргументы через fastcall, stdcall и т.д., типа ты её объявил в переменной, но аргументы перекинул как в статическую и всё на ок сработало, но в тех громоздких конструкциях я так и не нашёл минималистичного примера, который смог бы понять. Всё как-то слишком уж перегружено
Отчаянно нуждаюсь в помощи в понимании этого механизма

то, что я уже написал, это попытка сделать прямой вызов MessageBoxA, не используя исходники, но зная оффсет в библиотеке (для чего и нужна эта функция в принципе)
Цитата:
Сообщение от Спойлер  


C++:





Код:
#include 
class
user32
{
using
TypeMessageBoxA
=
int
(
__stdcall
*
)
(
HWND
,
LPCSTR
,
LPCSTR
,
UINT
)
;
TypeMessageBoxA messageBoxA
;
template

void
call
(
F f
,
Args
.
.
.
args
)
{
f
(
args
.
.
.
)
;
}
public
:
user32
(
)
{
auto
user32Module
=
LoadLibraryA
(
"user32.dll"
)
;
messageBoxA
=
reinterpret_cast

(
GetProcAddress
(
user32Module
,
"MessageBoxA"
)
)
;
}
void
MessageBoxA
(
HWND a
,
LPCSTR b
,
LPCSTR c
,
UINT d
)
{
call
(
messageBoxA
,
a
,
b
,
c
,
d
)
;
}
}
;
int
main
(
)
{
user32 obj
;
obj
.
MessageBoxA
(
NULL
,
"Resource not available\nDo you want to try again?"
,
"Account details"
,
MB_ICONWARNING
|
MB_CANCELTRYCONTINUE
|
MB_DEFBUTTON2
)
;
return
0
;
}


Компилятор вычисляет тип (base_address + 0x77B30) и получает char *, а затем пытается вызвать его с четырьмя аргументами. Это приводит к ошибке.

Ты должен кастить base_address + 0x77B30, в void(__stdcall *)(int a, const char* b, const char* c, long d) чтобы всё заработало.

А ещё я бы посоветовал заменить a b c d в user32::call на вариативный шаблон с аргументами.

И у тебя скобочки в вызове лишние...
 
Ответить с цитированием

  #5034  
Старый 15.01.2021, 20:44
nomio
Постоянный
Регистрация: 13.12.2020
Сообщений: 549
С нами: 2852272

Репутация: 48


По умолчанию

Охх как я люблю имуги,решил на плюсах пощупать имгуи,вставил рабочий код,имуги в папку с проектом,настройки для компиляции выставил.Компилирую - ошибки.Ставил старые,новые имуги,тыкал все что надо и все что не надо и в итоге пишу сюда

Visual Studio 2019

Imgui последней версии(на 1.63 такая же ***ня)

Найстроки проекта для компиляции стоят нормальные,компилил без имуги и все работало

Ошибки:

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


Папка с имуги файлами:

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


Код:

C++:





Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
#include "main.h"
#include "imgui/imgui.h"
#include "imgui/imgui_impl_dx9.h"
#include "imgui/imgui_impl_win32.h"
#include 
#define DIRECTINPUT_VERSION 0x0800
#include 
#include 
extern
LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
CALLBACK
PluginFree
(
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
bool
CALLBACK
WndProcHandler
(
HWND hwd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
{
ImGui_ImplWin32_WndProcHandler
(
hwd
,
msg
,
wParam
,
lParam
)
;
return
true
;
}
HRESULT CALLBACK
Reset
(
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
return
true
;
}
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
static
bool
menu
=
true
,
checkbox
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
ImGui
::
SetNextWindowSize
(
ImVec2
(
228
,
228
)
)
;
ImGui
::
Begin
(
"123"
,
&
menu
,
ImGuiWindowFlags_NoResize
|
ImGuiWindowFlags_NoCollapse
)
;
{
ImGui
::
Checkbox
(
"111"
,
&
checkbox
)
;
}
ImGui
::
End
(
)
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
return
true
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
SF
->
getRender
(
)
->
getD3DDevice
(
)
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_RESET
,
Reset
)
;
SF
->
getGame
(
)
->
registerWndProcCallback
(
SFGame
::
MEDIUM_CB_PRIORITY
,
WndProcHandler
)
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
PluginFree
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
 
Ответить с цитированием

  #5035  
Старый 15.01.2021, 20:47
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

CPP файлы не закинул в проект.
 
Ответить с цитированием

  #5036  
Старый 15.01.2021, 20:58
Sana_Minotazaki
Познающий
Регистрация: 20.08.2019
Сообщений: 75
С нами: 3543821

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

Не вижу функи в SF Api на проверку активности курсора как в lua sampIsCursorActive
 
Ответить с цитированием

  #5037  
Старый 15.01.2021, 21:23
sc6ut
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами: 3174020

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

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

sampIsCursorActive
SF->getSAMP()->getMisc()->iCursorMode == true/false

а вообще в большинстве случаев, ответ уже есть на форуме, просто стоит воспользоваться поиском 😉
 
Ответить с цитированием

  #5038  
Старый 16.01.2021, 01:52
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

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

SF->getSAMP()->getMisc()->iCursorMode == true/false
а вообще в большинстве случаев, ответ уже есть на форуме, просто стоит воспользоваться поиском 😉
Никаких тру/фолсе там нет. Учи матчасть.

sampSetCursorMode

Устанавливает режим курсора SAMP

blast.hk
 
Ответить с цитированием

  #5039  
Старый 16.01.2021, 12:35
tinkoir
Познающий
Регистрация: 01.08.2020
Сообщений: 97
С нами: 3043999

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

читаю одну книжечку по c++ и вот появился вопрос

в чем выгода работать функциям по адресу структуру, а не по ее значению? использование меньшего количества памяти?
 
Ответить с цитированием

  #5040  
Старый 16.01.2021, 14:26
dekname
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами: 2885808

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

Как можно установить trampoline hook в удаленный процесс (gta_sa.exe)?
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.