
09.09.2018, 23:40
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
Здравствуйте.
Заметил, что из за перехвата оконной процедуры(wndproc) через SetWindowLongPtr, при выгрузке плагина через консоль сф командой "pfree SFPlugin" происходит краш. В коллбэке деструктора игры и DLL PROCESS DETACH'e пытался восстанавливать оригинальный WndProc, но краш все равно был.
Может быть, кто нибудь знает, из за чего такое происходит?
C++:
Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#pragma comment(lib, "user32.lib")
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
WNDPROC oWndProc
=
0
;
LRESULT __stdcall
WndProc
(
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"WNDPROC CALLED"
)
;
return
CallWindowProcA
(
oWndProc
,
hWnd
,
uMsg
,
wParam
,
lParam
)
;
}
void
__stdcall
Destructor
(
)
{
static
bool
once
=
false
;
if
(
!
once
)
{
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
oWndProc
)
;
once
=
true
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
||
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
||
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
oWndProc
=
(
WNDPROC
)
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
WndProc
)
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
Destructor
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
else
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
Destructor
(
)
;
return
TRUE
;
}
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|