view plaincopy to clipboardprint?
//用汇编调用CreateThread函数传递当前类的指针给lpParameter参数
typedef struct tagTHREADTHIS //保存被创建窗体的信息结构
{
char pTitle[256];
char pClass[256];
DWORD style;
int width;
int height;
int xpos;
int ypos;
HWND hParent;
CSDKBaseWindow *pThis;
}THREADTHIS;
class CSDKBaseWindow //类的部分代码
{
LRESULT RealCreate(THREADTHIS *pCreateInfo);
HWND Create(char *pTitle,char *pClass,DWORD style,int width,int height,HWND hParent);
};
HWND CSDKBaseWindow::Create(char *pTitle,char *pClass,DWORD style,int width,int height,HWND hParent)
{
ENTER_CIRCLE
static CSDKBaseWindow::THREADTHIS thisThread={NULL};
thisThread.pThis=this;
thisThread.hParent=hParent;
lstrcpy(thisThread.pTitle,pTitle);
lstrcpy(thisThread.pClass,pClass);
thisThread.style = style;
thisThread.height=height;
thisThread.width=width;
LPTHREAD_START_ROUTINE threadCall;
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.style=CS_HREDRAW|CS_VREDRAW;
__asm
{
LEA EAX,CSDKBaseWindow::WndProc //消息处理回调
MOV wc.lpfnWndProc,EAX
}
wc.hInstance=GetModuleHandle(0);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=thisThread.pClass;
::RegisterClass(&wc);
WndProc((HWND)0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,(DWORD)thisThread.pThis);
if(hParent)
{
::CreateWindow(pClass,pTitle,style,CW_USEDEFAULT,CW_USEDEFAULT,width,height,hParent,NULL,wc.hInstance,NULL);
}
else
{
::CreateWindow(pClass,pTitle,style,CW_USEDEFAULT,CW_USEDEFAULT,width,height,NULL,NULL,wc.hInstance,NULL);
}
IS_NULL(thisThread.pThis->m_hWnd,"创建窗体失败!");
thisDC = GetWindowDC(thisThread.pThis->m_hWnd);
HANDLE tHandle;
__asm
{
LEA EAX,CSDKBaseWindow::RealCreate
MOV EBX,[EAX+1]
LEA EBX,[EAX+EBX+5] //通过汇编获得函数地址
MOV threadCall,EAX
PUSH 0
PUSH 0
PUSH offset thisThread
PUSH threadCall
PUSH 0
PUSH 0
MOV EAX,CreateThread //调用createthread启动消息循环
CALL EAX
MOV tHandle,EAX
}
thisThread.pThis->tThread=tHandle;
LEAVE_CIRCLE
return thisThread.pThis->m_hWnd;
}
LRESULT CSDKBaseWindow::RealCreate(THREADTHIS *pCreateInfo)//线程回调
{
MSG msg;
CSDKBaseWindow::THREADTHIS pTh;
CopyMemory(&pTh,pCreateInfo,sizeof(THREADTHIS));
while(::GetMessage(&msg,pTh.pThis->m_hWnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
0 评论:
发表评论