//用汇编调用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; }