//thunk 的安全實現, 廢話我就少說可,下面用**說明吧
#ifndef _winx_h_
#define _winx_h_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
//此**在xp到win7系統測試可正常執行
//函式模版用到的標記巨集
#ifndef fun_end_flag
//函式結束標記
#define fun_end_flag(x) \
dword winapi x##_end() \
//頭部宣告使用
#define def_end_fun(x) dword winapi x##_end();
//陣列使用
#define item_fun(x) x##_end,
//根據函式名獲取結束函式名
#define get_end_fun(x) x##_end
// 區域性變數的巨集定義
#define def_this_val 0x00000000
#define var_local(type,name,value) type name; __asm;
#endif
//如果定義此巨集
//則使用 templatewinproccode 作為函式模版, 其內容是通過反彙編templatewndproc獲得
//否則根據 templatewndproc 生成函式模版, templatewndproc 是編譯器生成的**
#define use_code_array
#ifdef _debug
#ifndef use_code_array
#define use_code_array //在除錯模式下,強制使用use_code_array巨集
#endif
#endif
//動態分配乙個templatewndproc函式,並讓函式內部變數指標指向pthis
lpvoid newtemplatewndproc(dword pthis);
const unsigned char templatewinproccode=;
class cthunk
virtual ~cthunk()
}virtual lresult windowproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)=0;
};class cwinx : public cthunk
virtual ~cwinx()
}cwinx& operator=(hwnd hwnd)
inline operator hwnd() const
inline hwnd getsafehwnd()
void attach(hwnd hwndnew)
hwnd detach()
virtual lresult windowproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)
if (m_subclassproc)
else
}; wceclass.lpfnwndproc = (wndproc)(void *)m_wndproc;
wceclass.cbsize = sizeof(wndclas***);
wceclass.style = dwcsstyle;
wceclass.hinstance = hinstance;
wceclass.lpszmenuname=lpcstr((dwstyle&ws_child)?0:nid);
if (lpicon) wceclass.hicon = (hicon)loadimage(hinstance, lpicon, image_icon, 32, 32, lr_createdibsection);
wceclass.hcursor = loadcursor(null, idc_arrow);
wceclass.hbrbackground = (hbrush) color_btnshadow;
if (lpicon) wceclass.hiconsm = (hicon)loadimage(hinstance, lpicon, image_icon, 16, 16, lr_createdibsection);
sprintf(szclass,"winx:%08x", wceclass.lpfnwndproc);
wceclass.lpszclassname = szclass;
atom atm=registerclas***(&wceclass);
if (atm)
else
}else*/}
return m_hwnd;
} static int messageloop(uint accelid=null)
}return msg.wparam;
}};//視窗函式模版
lresult callback templatewndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
fun_end_flag(templatewndproc) //函式結束標記
//設定函式區域性變數值
bool setlocalvar(void *lpfun, unsigned int size, unsigned int val, unsigned int new_val)
{ if (lpfun==null || size<5) return -1;
unsigned char *ptr=(unsigned char *)lpfun;
for (unsigned int i=0;i
Win32的時間型別
在win32時間型別有這樣幾種型別filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很大...
Win32的時間型別
在win32時間型別有這樣幾種型別 filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很...
WIN32彙編的高階語法
1 條件測試語句 操作符和邏輯運算 操 作 用 途 等於變數和運算元之間的比較 不等於變數和運算元之間的比較 大於 變數和運算元之間的比較 大於等於 變數和運算元之間的比較 小於 變數和運算元之間的比較 小於等於 變數和運算元之間的比較 位測試將變數和運算元做 與 操作 邏輯取反 對變數取反或對表示...