com 是个很大的课题,本人感觉比驱动还要繁杂,基础知识就不再讲解了,有兴趣的朋友可以看下这本书:

64位汇编语言之COMWebBrowser(64位汇编语言之COMWebBrowser)(1)

这是运行效果:

64位汇编语言之COMWebBrowser(64位汇编语言之COMWebBrowser)(2)

64位汇编语言之COMWebBrowser(64位汇编语言之COMWebBrowser)(3)

本汇编代码已以文档方式导入,以下是部分代码: inter_explorer_WndProc proc uses rbx rdi rsi _hWin:qword,_uMsg:qword,_wParam:qword,_lParam:qword LOCAL @rect:RECT LOCAL @pwnd:qword local @stRect:RECT local @stPs:PAINTSTRUCT LOCAL @wc:WNDCLASSEX LOCAL msg:MSG LOCAL @hwnd:HWND LOCAL @flags:qword LOCAL @ppIOleInPlaceActiveObject:qword mov rax,_uMsg .if eax==WM_CREATE ;.elseif eax == WM_MOUSEMOVE .elseif eax == WM_USER 1 nop ; invoke IsWindow,_hWin .if eax {} 0 invoke GetWindow,_hWin,GW_CHILD mov ebx,eax invoke GetClassName,rbx,addr @wc,sizeof @wc invoke lstrcmp,addr @wc,addr Shell_Embedding;若两个字符串相等则返回值为0。 .if eax == 0 mov esi,5 .while sdword ptr esi }0 invoke GetWindow,rbx,GW_CHILD mov rbx,rax invoke GetClassName,rbx,addr @wc,sizeof @wc invoke lstrcmp,addr @wc,addr Internet_Explorer_Server;若两个字符串相等则返回值为0。 .if eax == 0 invoke SetFocus,rbx invoke SetActiveWindow,rbx invoke SetForegroundWindow,rbx mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.QueryInterface],pWB2,addr IID_IOleInPlaceActiveObject,addr @ppIOleInPlaceActiveObject mov rbx,@ppIOleInPlaceActiveObject mov rbx,[rbx] invoke [rbx _IOleInPlaceActiveObject.OnFrameWindowActivate],@ppIOleInPlaceActiveObject,1 invoke [rbx _IOleInPlaceActiveObject.iolewindow._IUnknown.Release],@ppIOleInPlaceActiveObject .break .endif dec esi .if esi == 0 .break .endif .endw .endif .endif .elseif eax == WM_PAINT invoke BeginPaint,_hWin,addr @stPs invoke EndPaint,_hWin,addr @stPs .elseif eax==WM_CLOSE ; invoke CoUninitialize ; invoke PostQuitMessage,NULL ; invoke DestroyWindow,child_hwnd ; invoke DestroyWindow,hWnd invoke DestroyWindow,_hWin ; invoke PostQuitMessage,NULL ;; invoke TerminateThread,rax,0 ; invoke GetCurrentProcess ; invoke TerminateProcess,rax,0 .elseif eax ==WM_DESTROY invoke PostQuitMessage,NULL ; invoke GetCurrentThread ; invoke TerminateThread,rax,0 ; invoke GetCurrentProcess ; invoke TerminateProcess,rax,0 .else invoke DefWindowProc,_hWin,_uMsg,_wParam,_lParam ret .endif mov eax,0 ret inter_explorer_WndProc endp inter_explorer_thread proc uses rbx rsi rdi _hWin:qword LOCAL @rect:RECT LOCAL @wc:WNDCLASSEX LOCAL @msg:MSG LOCAL @parenthand:qword LOCAL @IConnectionPointContainer:qword LOCAL @DWebBrowserEvents2:qword LOCAL @IConnectionPoint:qword LOCAL @varinat:VARIANT LOCAL @extent:qword LOCAL @inplace:qword LOCAL @classhand:qword LOCAL @stRect:RECT ; invoke InitCommonControls invoke CoInitialize, NULL ; invoke CoInitializeEx, mov rax,_hWin mov @parenthand,rax invoke RtlZeroMemory,addr @wc,sizeof @wc mov @wc.cbSize,SIZEOF WNDCLASSEX mov @wc.style,CS_HREDRAW or CS_VREDRAW; CS_DBLCLKS; lea rax,inter_explorer_WndProc mov @wc.lpfnWndProc, rax;OFFSET inter_explorer_WndProc mov @wc.cbClsExtra,NULL mov @wc.cbWndExtra,NULL push hInstance pop @wc.hInstance mov @wc.hbrBackground,COLOR_BTNFACE 1 mov @wc.lpszMenuName,NULL lea rax,ClassName_for_html mov @wc.lpszClassName,rax;OFFSET ClassName_for_html invoke LoadCursor,NULL,IDC_ARROW mov @wc.hCursor,rax invoke RegisterClassEx, addr @wc mov @classhand,rax invoke GetDlgItem,_hWin,1001 invoke GetClientRect,rax,addr @rect mov esi,@rect.right mov edi,@rect.left sub esi,edi mov edi, @rect.bottom sub edi,@rect.top ; invoke GetDesktopWindow invoke CreateWindowEx,0h,@classhand,0,WS_CHILD WS_CLIPSIBLINGS WS_CLIPCHILDREN,0,0,rsi,rdi,_hWin,11111,hInstance,NULL mov _iOleClientSiteEx.inplace._frame.window,rax ;invoke SetParent,rax,_hWin;hWnd invoke ShowWindow,_iOleClientSiteEx.inplace._frame.window,SW_SHOW invoke UpdateWindow,_iOLEClientSiteEx.inplace._frame.window invoke inihtml invoke CoGetClassObject,addr CLSID_WebBrowser,CLSCTX_INPROC_SERVER or CLSCTX_INPROC_HANDLER , 0,addr IID_IClassFactory, addr punk;CLSCTX_INPROC_SERVER equ 1 or CLSCTX_INPROC_HANDLER equ 2 CLSCTX_ALL .if rax {} S_OK mov rax,0 ret .endif mov rbx,punk mov rbx,[rbx] invoke [rbx fix_IClassFactory.CreateInstance],punk,0,addr IID_IOleObject,addr pObject .if rax {} S_OK mov rax,0 ret .endif invoke [rbx fix_IClassFactory._IUnknown.Release],punk mov rbx,pObject mov rbx,[rbx] lea rdx,@_myIOleClientSiteEx invoke [rbx fix_IOleObject.SetClientSite],pObject,rdx; .if rax {} S_OK mov rax,0 ret .endif invoke OleSetContainedObject, pObject,1 ; Let browser object know that it is embedded in an OLE container. .if rax {} S_OK mov rax,0 ret .endif invoke GetClientRect,_hWin,addr @rect .if rax == 0 mov rax,0 ret .endif OLEIVERB_PRIMARY EQU 0 OLEIVERB_SHOW EQU - 1 OLEIVERB_OPEN EQU - 2 OLEIVERB_HIDE EQU - 3 OLEIVERB_UIACTIVATE EQU - 4 OLEIVERB_INPLACEACTIVATE EQU - 5 OLEIVERB_DISCARDUNDOSTATE EQU - 6 ;OLEIVERB_SHOW:显示OLE控件。 ;OLEIVERB_OPEN:在另外一个窗口中打开OLE控件。 ;OLEIVERB_INPLACEACTIVATE:不带有工具栏和菜单栏的方式。 ;OLEIVERB_UIACTIVATE:激活OLE的菜单栏和工具栏。 ;OLEIVERB_PRIMARY:打开编辑状态的OLE控件。 ;OLEIVERB_DISCARDUNDOSTATE:关闭OLE控件。 ; mov rbx,pObject mov rbx,[rbx] lea r9,@_myIOleClientSiteEx invoke [rbx fix_IOleObject.DoVerb],pObject,OLEIVERB_INPLACEACTIVATE,0,r9,0, _iOleClientSiteEx.inplace._frame.window,addr @rect lea rdi, @extent mov eax,@rect.right mov [rdi],eax mov eax,@rect.bottom mov [rdi 4],eax ; coinvoke pObject, IOleObject,SetExtent,DVASPECT_CONTENT,rdi invoke [rbx fix_IOleObject.SetExtent],pObject,rdi ; coinvoke pObject, IUnknown_, QueryInterface, addr IID_IOleInPlaceObject, addr @inplace invoke [rbx fix_IOleObject._IUnknown.QueryInterface],pObject, addr IID_IOleInPlaceObject, addr @inplace ; coinvoke @inplace, IOleInPlaceObject,SetObjectRects, addr @rect,addr @rect mov rbx,@inplace mov rbx,[rbx] invoke [rbx fix_IOleInPlaceObject.SetObjectRects],@inplace, addr @rect,addr @rect .if eax {} S_OK mov eax,0 ret .endif ; coinvoke pObject, IUnknown_, QueryInterface, addr IID_IWebBrowser2, addr pWB2 mov rbx,pObject mov rbx,[rbx] invoke [rbx fix_IOleObject._IUnknown.QueryInterface],pObject,addr IID_IWebBrowser2, addr pWB2 lea rcx,pWB2 .if eax {} S_OK mov eax,0 ret .endif mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.put_Left],pWB2,0 invoke [rbx IWebBrowser2Vtbl.put_Top],pWB2,0 mov eax,@rect.right invoke [rbx IWebBrowser2Vtbl.put_Width],pWB2,rax mov eax,@rect.bottom invoke [rbx IWebBrowser2Vtbl.put_Height],pWB2,rax invoke [rbx IWebBrowser2Vtbl.put_RegisterAsBrowser],pWB2,VARIANT_TRUE ; invoke [rbx IWebBrowser2Vtbl.get_HWND],pWB2,addr browser_hwnd ; invoke [rbx IWebBrowser2Vtbl.put_Visible],pWB2,VARIANT_TRUE; ; invoke [rbx IWebBrowser2Vtbl.put_Silent],pWB2,VARIANT_TRUE; ; invoke [rbx IWebBrowser2Vtbl.put_TheaterMode],pWB2,VARIANT_TRUE; mov rax,browser_hwnd ; comment % ; invoke [rbx IWebBrowser2Vtbl.QueryInterface],pWB2,addr IID_IDispatch,addr ppIDispatch ; .if eax {} S_OK ; mov eax,0 ; ret ; .endif invoke [rbx IWebBrowser2Vtbl.get_Application],pWB2,addr pIDispatch .if eax {} S_OK mov eax,0 ret .endif invoke [rbx IWebBrowser2Vtbl.QueryInterface],pWB2,addr IID_IConnectionPointContainer,addr @IConnectionPointContainer .if eax {} S_OK mov eax,0 ret .endif mov rax,@IConnectionPointContainer mov rbx,[rax] invoke [rbx fix_IConnectionPointContainer.FindConnectionPoint],@IConnectionPointContainer,addr DIID_DWebBrowserEvents2,addr pIConnectionPoint_obj .if eax {} S_OK mov eax,0 ret .endif ; IID_IDispatch ;DIID_DWebBrowserEvents2 mov rax,pIConnectionPoint_obj mov rbx,[rax] lea rcx,_iOleClientSiteEx.DWebBrowserEvents2._IUnknown.QueryInterface lea rdi,@_myIOleClientSiteEx lea rdx,[rdi 18h 18h] invoke [rbx fix_IConnectionPoint.Advise],pIConnectionPoint_obj,rdx,addr dwcookie .if eax {} S_OK mov eax,0 ret .endif invoke [rbx fix_IConnectionPoint._IUnknown.Release],pIConnectionPoint_obj ; .if eax {} S_OK ; mov eax,0 ; ret ; .endif ; ; mov rax,@IConnectionPointContainer mov rbx,[rax] ;计算比例关系 comment ~ invoke GetDlgItem,_hWin,1002 ;webbrowser mov rbx,eax invoke GetWindowRect,rbx,addr @stRect invoke ScreenToClient,_hWin,addr @stRect.left invoke ScreenToClient,_hWin,addr @stRect.right fild @stRect.left fild org_main_width fdivp st(1),st(0) fstp webbrowser_window.x fild @stRect.top fild org_main_higth fdivp st(1),st(0) fstp webbrowser_window.y mov eax,@stRect.left sub @stRect.right,eax fild @stRect.right fild org_main_width fdivp st(1),st(0) fstp webbrowser_window._width mov eax,@stRect.top sub @stRect.bottom,eax fild @stRect.bottom fild org_main_higth fdivp st(1),st(0) fstp webbrowser_window.higth invoke GetDlgItem,_hWin,1005 mov rbx,eax invoke GetWindowRect,rbx,addr @stRect invoke ScreenToClient,_hWin,addr @stRect.left invoke ScreenToClient,_hWin,addr @stRect.right fild @stRect.left fild org_main_width fdivp st(1),st(0) fstp viewnetaddress.x fild @stRect.top fild org_main_higth fdivp st(1),st(0) fstp viewnetaddress.y mov eax,@stRect.left sub @stRect.right,eax fild @stRect.right fild org_main_width fdivp st(1),st(0) fstp viewnetaddress._width mov eax,@stRect.top sub @stRect.bottom,eax fild @stRect.bottom fild org_main_higth fdivp st(1),st(0) fstp viewnetaddress.higth invoke GetDlgItem,_hWin,1003 mov rbx,eax invoke GetWindowRect,rbx,addr @stRect invoke ScreenToClient,_hWin,addr @stRect.left invoke ScreenToClient,_hWin,addr @stRect.right fild @stRect.left fild org_main_width fdivp st(1),st(0) fstp baiduzhuye.x fild @stRect.top fild org_main_higth fdivp st(1),st(0) fstp baiduzhuye.y mov eax,@stRect.left sub @stRect.right,eax fild @stRect.right fild org_main_width fdivp st(1),st(0) fstp baiduzhuye._width mov eax,@stRect.top sub @stRect.bottom,eax fild @stRect.bottom fild org_main_higth fdivp st(1),st(0) fstp baiduzhuye.higth invoke GetDlgItem,_hWin,1001 mov rbx,eax invoke GetWindowRect,rbx,addr @stRect invoke ScreenToClient,_hWin,addr @stRect.left invoke ScreenToClient,_hWin,addr @stRect.right fild @stRect.left fild org_main_width fdivp st(1),st(0) fstp tencentzhuye.x fild @stRect.top fild org_main_higth fdivp st(1),st(0) fstp tencentzhuye.y mov eax,@stRect.left sub @stRect.right,eax fild @stRect.right fild org_main_width fdivp st(1),st(0) fstp tencentzhuye._width mov eax,@stRect.top sub @stRect.bottom,eax fild @stRect.bottom fild org_main_higth fdivp st(1),st(0) fstp tencentzhuye.higth invoke GetDlgItem,_hWin,1004 mov rbx,eax invoke GetWindowRect,rbx,addr @stRect invoke ScreenToClient,_hWin,addr @stRect.left invoke ScreenToClient,_hWin,addr @stRect.right fild @stRect.left fild org_main_width fdivp st(1),st(0) fstp youselfzhuye.x fild @stRect.top fild org_main_higth fdivp st(1),st(0) fstp youselfzhuye.y mov eax,@stRect.left sub @stRect.right,eax fild @stRect.right fild org_main_width fdivp st(1),st(0) fstp youselfzhuye._width mov eax,@stRect.top sub @stRect.bottom,eax fild @stRect.bottom fild org_main_higth fdivp st(1),st(0) fstp youselfzhuye.higth invoke CreateFontIndirect, addr yahei_8 mov hfont_8,eax invoke CreateFontIndirect, addr yahei_9 mov hfont_9,eax invoke CreateFontIndirect, addr yahei_10 mov hfont_10,eax invoke CreateFontIndirect, addr yahei_11 mov hfont_11,eax invoke CreateFontIndirect, addr yahei_12 mov hfont_12,eax invoke CreateFontIndirect, addr yahei_14 mov hfont_14,eax invoke CreateFontIndirect, addr yahei_16 mov hfont_16,eax comment ~ invoke MultiByteToWideChar,CP_ACP,0,addr netaddress_aboutblank,-1,addr netbuffer,sizeof netbuffer mov headbuffer,rax lea esi,netbuffer invoke SysAllocString,addr netbuffer mov hsysstring,rax mov _VARIANT_buffer.vt,VT_BSTR mov _VARIANT_buffer.pbstrVal,rax lea eax, _VARIANT_buffer mov rbx,pWB2 mov rbx,[rbx] ; invoke [rbx IWebBrowser2Vtbl.Navigate2],pWB2,rax,0,0,0,0 invoke SysFreeString,hsysstring invoke PostMessage,_iOleClientSiteEx.inplace._frame.window,WM_USER 1,0,0 .while TRUE ; invoke PeekMessage,addr @msg,NULL,0,0,PM_REMOVE invoke GetMessage,addr @msg,NULL,0,0 .if rax == 0 .break .endif ;.if eax invoke TranslateMessage,addr @msg invoke DispatchMessage,addr @msg .endw ret inter_explorer_thread endp movwindow proc uses rbx rsi rdi hWin:qword,id:qword,_x:qword,_y:qword,Porg_rect:qword local @width:qword ;某个控件的宽度 LOCAL @higth:qword LOCAL @child_x:qword ;某个控件的x坐标 LOCAL @child_y:qword LOCAL @rect:RECT invoke GetDlgItem,hWin,id mov rbx,rax invoke GetWindowRect,rax,addr @rect invoke ScreenToClient,hWin,addr @rect.left invoke ScreenToClient,hWin,addr @rect.right mov rsi,Porg_rect fild [rsi RECT.right] fild [rsi RECT.left] fsubp st(1),st (0) ;原始宽度 fld _x fmul st(0),st (1) ;;原始宽度*缩放率 faddp st(1),st (0) ;;原始宽度 原始宽度*缩放率 fistp @width fild [rsi RECT.bottom] fild [rsi RECT.top] fsubp st(1),st (0) ;原始高度 fld _y fmul st(0),st (1) ;;原始高度*缩放率 faddp st(1),st (0) ;;原始高度 原始高度*缩放率 fistp @higth fild [rsi RECT.left];x坐标 fld _x fmul st(0),st (1) ;;原始x坐标*缩放率 faddp st(1),st (0) fistp @child_x fild [rsi RECT.top];y坐标 fld _y fmul st(0),st (1) ;;原始y坐标*缩放率 faddp st(1),st (0) ; fld float05 ; fmulp st(1),st (0) fistp @child_y ; sub @child_y,15 mov eax,[rsi RECT.bottom] sub eax,[rsi RECT.top] .if rax {= @higth ; mov @higth,rax .endif invoke MoveWindow,rbx,@child_x,@child_y,@width,@higth,TRUE ret movwindow endp WndProc proc uses rbx rsi rdi hWin:HWND,uMsg:UINT64,wParam:WPARAM,lParam:LPARAM LOCAL @varinat:VARIANT local @stPs:PAINTSTRUCT LOCAL @rect:RECT LOCAL @x:REAL8 ;x轴比例因子 LOCAL @y:real8 local @width:qword ;某个控件的宽度 LOCAL @higth:qword LOCAL @child_x:qword ;某个控件的x坐标 LOCAL @child_y:qword mov rax,uMsg .if eax==WM_INITDIALOG push hWin pop hWnd invoke GetWindowRect,hWin,addr org_main_rect invoke ScreenToClient,hWin,addr org_main_rect.left invoke ScreenToClient,hWin,addr org_main_rect.right mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax invoke GetDlgItem,hWin,1002 mov rbx,rax invoke GetWindowRect,rax,addr INPUT_EDIT invoke ScreenToClient,hWin,addr INPUT_EDIT.left ;指向窗口的句柄,此窗口的用户空间将被用来转换。 invoke ScreenToClient,hWin,addr INPUT_EDIT.right invoke GetDlgItem,hWin,1003 invoke GetWindowRect,rax,addr GoHome invoke ScreenToClient,hWin,addr GoHome.left invoke ScreenToClient,hWin,addr GoHome.right invoke GetDlgItem,hWin,1004 invoke GetWindowRect,rax,addr GoBack invoke ScreenToClient,hWin,addr GoBack.left invoke ScreenToClient,hWin,addr GoBack.right invoke GetDlgItem,hWin,1005 invoke GetWindowRect,rax,addr GoForward invoke ScreenToClient,hWin,addr GoForward.left invoke ScreenToClient,hWin,addr GoForward.right invoke GetDlgItem,hWin,1006 invoke GetWindowRect,rax,addr GoSTOP invoke ScreenToClient,hWin,addr GoSTOP.left invoke ScreenToClient,hWin,addr GoSTOP.right invoke CreateThread,0,0,addr inter_explorer_thread,hWnd,0,0 .elseif eax == WM_SIZE .if pWB2 == 0 ret .endif invoke GetWindowRect,hWin,addr @rect invoke ScreenToClient,hWin,addr @rect.left invoke ScreenToClient,hWin,addr @rect.right ;求缩放的比例因子 (根据主窗口的变化) finit ;初始浮点寄存器 mov eax,@rect.left sub @rect.right,eax mov eax,@rect.top sub @rect.bottom,eax fild @rect.right fild org_main_rect.right fsubp st(1),st (0) fild org_main_rect.right fdivp st(1),st (0) fstp qword ptr @x fild @rect.bottom fild org_main_rect.bottom fsubp st(1),st (0) fild org_main_rect.bottom fdivp st(1),st (0) fstp qword ptr @y ; invoke GetDlgItem,hWin,1001 ; invoke GetClientRect,rax,addr org_main_rect mov @varinat.vt,VT_BOOL mov @varinat.boolVal,VARIANT_TRUE mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.put_Resizable],pWB2,addr @varinat mov @varinat.vt,VT_BOOL mov @varinat.boolVal,VARIANT_TRUE mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.put_StatusBar],pWB2,addr @varinat invoke [rbx IWebBrowser2Vtbl.put_Left],pWB2,0 invoke [rbx IWebBrowser2Vtbl.put_Top],pWB2,0 mov eax,@rect.right invoke [rbx IWebBrowser2Vtbl.put_Width],pWB2,rax mov eax,@rect.bottom invoke [rbx IWebBrowser2Vtbl.put_Height],pWB2,rax mov esi,@rect.right mov edi,@rect.bottom ; invoke MoveWindow,_iOleClientSiteEx.inplace._frame.window,0,0,org_main_rect.right,org_main_rect.bottom,TRUE invoke MoveWindow,_iOleClientSiteEx.inplace._frame.window,0,0,rsi,rdi,TRUE invoke movwindow,hWin,1002,@x,@y,addr INPUT_EDIT invoke movwindow,hWin,1003,@x,@y,addr GoHome invoke movwindow,hWin,1004,@x,@y,addr GoBack invoke movwindow,hWin,1005,@x,@y,addr GoForward invoke movwindow,hWin,1006,@x,@y,addr GoSTOP comment ~ mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax fild org_main_rect.right fld webbrowser_window.x fmulp st (1),st (0) fistp org_main_rect.left fild org_main_rect.bottom fld webbrowser_window.y fmulp st (1),st (0) fistp org_main_rect.top fild org_main_rect.right fld webbrowser_window._width fmulp st (1),st (0) fistp org_main_rect.right fild org_main_rect.bottom fld webbrowser_window.higth fmulp st (1),st (0) fistp org_main_rect.bottom invoke GetDlgItem,_hWin,1002 mov ebx,eax invoke MoveWindow,ebx,org_main_rect.left,org_main_rect.top,org_main_rect.right,org_main_rect.bottom,TRUE mov @varinat.vt,VT_BOOL mov @varinat.boolVal,VARIANT_TRUE mov ebx,pWB2 mov ebx,[ebx] invoke [ebx IWebBrowser2Vtbl.put_Resizable],pWB2,addr @varinat invoke [ebx IWebBrowser2Vtbl.put_Left],pWB2,0 invoke [ebx IWebBrowser2Vtbl.put_Top],pWB2,0 mov eax,org_main_rect.right invoke [ebx IWebBrowser2Vtbl.put_Width],pWB2,eax mov eax,org_main_rect.bottom invoke [ebx IWebBrowser2Vtbl.put_Height],pWB2,eax invoke GetWindowRect,_hWin,addr org_main_rect invoke ScreenToClient,_hWin,addr org_main_rect.left invoke ScreenToClient,_hWin,addr org_main_rect.right mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax fild org_main_rect.right fld viewnetaddress.x fmulp st (1),st (0) fistp org_main_rect.left fild org_main_rect.bottom fld viewnetaddress.y fmulp st (1),st (0) fistp org_main_rect.top fild org_main_rect.right fld viewnetaddress._width fmulp st (1),st (0) fistp org_main_rect.right fild org_main_rect.bottom fld viewnetaddress.higth fmulp st (1),st (0) fistp org_main_rect.bottom invoke GetDlgItem,_hWin,1005 mov ebx,eax invoke MoveWindow,ebx,org_main_rect.left,org_main_rect.top,org_main_rect.right,org_main_rect.bottom,TRUE invoke GetWindowRect,_hWin,addr org_main_rect invoke ScreenToClient,_hWin,addr org_main_rect.left invoke ScreenToClient,_hWin,addr org_main_rect.right mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax fild org_main_rect.right fld baiduzhuye.x fmulp st (1),st (0) fistp org_main_rect.left fild org_main_rect.bottom fld baiduzhuye.y fmulp st (1),st (0) fistp org_main_rect.top fild org_main_rect.right fld baiduzhuye._width fmulp st (1),st (0) fistp org_main_rect.right fild org_main_rect.bottom fld baiduzhuye.higth fmulp st (1),st (0) fistp org_main_rect.bottom invoke GetDlgItem,_hWin,1003 mov ebx,eax invoke MoveWindow,ebx,org_main_rect.left,org_main_rect.top,org_main_rect.right,org_main_rect.bottom,TRUE invoke GetWindowRect,_hWin,addr org_main_rect invoke ScreenToClient,_hWin,addr org_main_rect.left invoke ScreenToClient,_hWin,addr org_main_rect.right mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax fild org_main_rect.right fld tencentzhuye.x fmulp st (1),st (0) fistp org_main_rect.left fild org_main_rect.bottom fld tencentzhuye.y fmulp st (1),st (0) fistp org_main_rect.top fild org_main_rect.right fld tencentzhuye._width fmulp st (1),st (0) fistp org_main_rect.right fild org_main_rect.bottom fld tencentzhuye.higth fmulp st (1),st (0) fistp org_main_rect.bottom invoke GetDlgItem,_hWin,1001 mov ebx,eax invoke MoveWindow,ebx,org_main_rect.left,org_main_rect.top,org_main_rect.right,org_main_rect.bottom,TRUE invoke GetWindowRect,_hWin,addr org_main_rect invoke ScreenToClient,_hWin,addr org_main_rect.left invoke ScreenToClient,_hWin,addr org_main_rect.right mov eax,org_main_rect.left sub org_main_rect.right,eax mov eax,org_main_rect.top sub org_main_rect.bottom,eax fild org_main_rect.right fld youselfzhuye.x fmulp st (1),st (0) fistp org_main_rect.left fild org_main_rect.bottom fld youselfzhuye.y fmulp st (1),st (0) fistp org_main_rect.top fild org_main_rect.right fld youselfzhuye._width fmulp st (1),st (0) fistp org_main_rect.right fild org_main_rect.bottom fld youselfzhuye.higth fmulp st (1),st (0) fistp org_main_rect.bottom invoke GetDlgItem,_hWin,1004 mov ebx,eax invoke MoveWindow,ebx,org_main_rect.left,org_main_rect.top,org_main_rect.right,org_main_rect.bottom,TRUE ;;;;这里是字体的缩放,还没有实现 invoke GetDlgItem,_hWin,1003 mov ebx,eax invoke GetWindowDC,ebx mov @hdc,eax INVOKE SelectObject,@hdc,hfont_10 invoke GetDlgItemText,_hWin,1003,addr @tempbuffer,sizeof @tempbuffer mov esi,eax invoke GetTextExtentPoint32, @hdc,addr @tempbuffer,esi,addr tagSIZE_buffer invoke ReleaseDC,ebx,@hdc comment ~ .elseif eax==WM_COMMAND mov rax,wParam and rax,0FFFFh .if rax==IDM_FILE_EXIT invoke SendMessage,hWin,WM_CLOSE,0,0 .elseif rax==IDM_HELP_ABOUT invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL .elseif eax == 1003 invoke GetDlgItemText,hWin,1002,addr _1003buffer,sizeof _1003buffer invoke MultiByteToWideChar,CP_ACP,0,addr _1003buffer,-1,addr netbuffer,sizeof netbuffer lea rsi,netbuffer invoke SysAllocString,addr netbuffer mov hsysstring,rax mov _VARIANT_buffer.vt,VT_BSTR mov _VARIANT_buffer.pbstrVal,rax lea rax, _VARIANT_buffer mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.Navigate2],pWB2,rax,0,0,0,0 invoke SysFreeString,hsysstring .elseif eax == 1004 mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.GoBack],pWB2 .elseif eax == 1005 mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.GoForward],pWB2 .elseif eax == 1006 mov rbx,pWB2 mov rbx,[rbx] invoke [rbx IWebBrowser2Vtbl.Stop],pWB2 .endif ; .elseif eax==WM_SIZE .elseif eax == WM_PAINT invoke BeginPaint,hWin,addr @stPs invoke EndPaint,hWin,addr @stPs .elseif eax==WM_CLOSE invoke SendMessage, _iOleClientSiteEx.inplace._frame.window,WM_CLOSE,0,0 invoke DestroyWindow,hWin .elseif uMsg==WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWin,uMsg,wParam,lParam ret .endif xor rax,rax ret WndProc endp end

,