К основному контенту

Old tricks: The way to use member function for C-style callback

template <class T> class Thunk
{
BYTE asm86[12];
public:
typedef void (__stdcall T::*ThunkType)();

void InitThunk(ThunkType method, const T *pthis)
{
union uPtr { BYTE *byte; DWORD *dword; ThunkType method; };

uPtr pAsm86;
pAsm86.byte = asm86;
uPtr pFn;
pFn.method = method;

*pAsm86.byte++ = 0x58; //pop eax
*pAsm86.byte++ = 0x68; //push pthis
*pAsm86.dword++ = (DWORD)pthis;
*pAsm86.byte++ = 0x50; //push eax
*pAsm86.byte++ = 0xE9; //jmp method
*pAsm86.dword++ = (DWORD)pFn.dword - (DWORD)(this+1);

//This function is valid only on multiprocessor computers.
//FlushInstructionCache(GetCurrentProcess(), this, sizeof(*this));
}

FARPROC GetThunk() const
{
return (FARPROC)this;
}
};
class Window : private Thunk<Window>
{
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
public:
Window()
{
InitThunk((Thunk<Window>::ThunkType)WindowProc,this);
WNDCLASSEX wc;
wc.lpfnWndProc=(WNDPROC)GetThunk();
}
};

Комментарии

Популярные сообщения из этого блога

Raspberry Pi 3 и Telegram CLI - установка

Raspberry Pi 3 и Telegram CLI - установка
Так уж получилось, что я приобрел (сделал себе небольшой подарок) Raspberry Pi 3 и занялся ее и линукса в частности изучением, благо ресурсов по этой теме в сети хватает.

Начать решил с минимального шлюза во внешний мир. Для этих целей вроде, как нельзя лучше, подходит Телеграм. Начнем с Telegram CLI, позже попробем сделать и бота.

И так начнем!

Отправным пунктом будет статья: http://www.instructables.com/id/Telegram-on-Raspberry-Pi/

1. устанавливаем библиотеки:sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev makeмне понадобилась еще и sudo apt-get install libjansson-dev 2. Клонируем архив: git clone --recursive https://github.com/vysheng/tg.git && cd tg 3. конфигурируем и пытаемся собрать проект./configuremake
на этом этапе могут появиться ошибки:
l/crypto/rsa_pem_openssl.c:41:6: error: dereferencing pointer to incomplete type ‘RSA {aka struct rsa_st}’ ret->e = unwrap_bn (TGLC_bn_n…

Этот пост огорчит Вашего Кота :)

Вчера попал в 18 километровую пробку. По радио сказали, что произошла сильная авария. Когда доехали до места аварии, разбитых машин уже не было, но дорогу старательно отмывали от... песочка для котячих туалетов! Видимо вывалилось из грузовика. Это всеравно, что тушить Памперсы :) На обратном пути, через 3 часа, дорожная служба все еще отдирала дорогу!

P.S. "Повезло" прочувствовать аквапланинг :( на 140км/ч при перестроении. На Quattro такого никогда не было! >:-(