
Опытный
 
Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006
Репутация: нет Всего: 4
|
Наконец-то нашел способ создания контролов. через ole. сделал по инструкциям и не пошло... думаю, что наиболее простым способом будет сделать перевод из кода асма в дельфи. большую часть кодазанимает описание интерфейсов. может быть кто-нибудь сможет помочь? | Код | ; ; KaKeeware is proud to present the smallest Web Browser in the world ; Author: Adam Blaszczyk (c) 2004 ; WWW: http://www.kakeeware.com ; e-mail: adam[]kakeeware[]com ; ; Feel free to use this source code in your applications, but remember ; that credits are always welcomed :-) ; ; This source code is based on the program that I wrote for my book ; about Win32ASM that was published by Helion in 2004: ; http://helion.pl/ksiazki/asmwin.htm ; .586 .MODEL FLAT,STDCALL
OLEIVERB_INPLACEACTIVATE =-5 INCLUDE windows.inc
INV equ INVOKE OFS equ OFFSET BPTR equ BYTE PTR WPTR equ WORD PTR DPTR equ DWORD PTR
MOM MACRO t:REQ, s:REQ push s pop t ENDM
MOP MACRO t:REQ, c:REQ mov eax,t MOM [eax],c ENDM
XID MACRO gn,gv ;.data gn label dword xx SUBSTR <gv>,2,8 dd @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,11,4 dw @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,16,4 dw @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,21,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,23,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,26,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,28,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,30,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,32,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,34,2 db @CatStr(<0>,%xx,<h>) xx SUBSTR <gv>,36,2 db @CatStr(<0>,%xx,<h>) ENDM
INCLUDEX MACRO plik:REQ include plik.inc includelib plik.lib ENDM
INCX MACRO mods:VARARG FOR c,<mods> INCLUDEX c ENDM ENDM
INCX kernel32,user32,ole32
UNI MACRO un,nv un label dword FORC c,<nv> dw '&c' ENDM dw NULL ENDM
COM MACRO ppv,me,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aa,ab,ac,ad,ae,af x EQU @InStr(1, <me>, <::>) rin SUBSTR <me>,1,x-1 rme SUBSTR <me>,x+2 rxx CATSTR rin,<Vtbl>,<.>,rme
FOR ar, <af,ae,ad,ac,ab,aa,a9,a8,a7,a6,a5,a4,a3,a2,a1,a0> IFNB <ar> IF @InStr(1,<ar>,<ADDR>) eq 0 push ar ELSE txme SUBSTR <ar>,5 lea eax,txme push eax ENDIF ENDIF ENDM mov eax,DPTR [ppv] mov eax,[eax] mov eax,[eax.rxx] push ppv call eax ENDM OLEINPLACEFRAMEINFO struct cb dd ? fMDIApp dd ? hwndFrame dd ? haccel dd ? cAccelEntries dd ? OLEINPLACEFRAMEINFO ends
INTERFACE_DEF_LONG_START MACRO iface iface&Vtbl STRUC QueryInterface dd ? AddRef dd ? Release dd ? ENDM
INTERFACE_DEF_LONG_MET MACRO me:VARARG FOR ar, <me> IFNB <ar> ar dd ? ENDIF ENDM ENDM INTERFACE_DEF_LONG_END MACRO iface iface&Vtbl ENDS
iface STRUC lpVtbl dd ? iface ENDS
ENDM
INTERFACE_DEF_LONG_START IDispatch INTERFACE_DEF_LONG_MET,\ GetTypeInfoCount,\ GetTypeInfo,\ GetIDsOfNames,\ IDispatch_Invoke INTERFACE_DEF_LONG_END IDispatch
INTERFACE_DEF_LONG_START IWebBrowser2 INTERFACE_DEF_LONG_MET,\ GetTypeInfoCount,\ GetTypeInfo,\ GetIDsOfNames,\ xInvoke,\ GoBack,\ GoForward,\ GoHome,\ GoSearch,\ Navigate,\ Refresh,\ Refresh2,\ Stop INTERFACE_DEF_LONG_MET,\ get_Application,\ get_Parent,\ get_Container,\ get_Document,\ get_TopLevelContainer,\ get_Type,\ get_Left,\ put_Left,\ get_Top,\ put_Top,\ get_Width,\ put_Width,\ get_Height,\ put_Height,\ get_LocationName INTERFACE_DEF_LONG_MET,\ get_LocationURL,\ get_Busy,\ Quit,\ ClientToWindow,\ PutProperty,\ GetProperty,\ get_Name,\ get_HWND,\ get_FullName,\ get_Path,\ get_Visible,\ put_Visible,\ get_StatusBar,\ put_StatusBar,\ get_StatusText,\ put_StatusText,\ get_ToolBar INTERFACE_DEF_LONG_MET,\ put_ToolBar,\ get_MenuBar,\ put_MenuBar,\ get_FullScreen,\ put_FullScreen,\ Navigate2,\ QueryStatusWB,\ ExecWB,\ ShowBrowserBar,\ get_ReadyState,\ get_Offline,\ put_Offline,\ get_Silent,\ put_Silent,\ get_RegisterAsBrowser,\ put_RegisterAsBrowser INTERFACE_DEF_LONG_MET,\ get_RegisterAsDropTarget,\ put_RegisterAsDropTarget,\ get_TheaterMode,\ put_TheaterMode,\ get_AddressBar,\ put_AddressBar,\ get_Resizable,\ put_Resizable INTERFACE_DEF_LONG_END IWebBrowser2
INTERFACE_DEF_LONG_START IOleObject INTERFACE_DEF_LONG_MET,\ SetClientSite,\ GetClientSite,\ SetHostNames,\ Close,\ SetMoniker,\ GetMoniker,\ InitFromData,\ GetClipboardData,\ DoVerb,\ EnumVerbs,\ Update,\ IsUpToDate,\ GetUserClassID,\ GetUserType,\ SetExtent,\ GetExtent,\ Advise,\ Unadvise,\ EnumAdvise,\ GetMiscStatus,\ SetColorScheme INTERFACE_DEF_LONG_END IOleObject
INTERFACE_DEF_LONG_START IOleInPlaceObject INTERFACE_DEF_LONG_MET,\ GetWindow,\ ContextSensitiveHelp,\ InPlaceDeactivate,\ UIDeactivate,\ SetObjectRects,\ ReactivateAndUndo INTERFACE_DEF_LONG_END IOleInPlaceObject
INTERFACE_DEF_LONG_START IHTMLDocument2 INTERFACE_DEF_LONG_MET,\ GetTypeInfoCount,\ GetTypeInfo,\ GetIDsOfNames,\ IHTMLDocument2_Invoke,\ get_Script,\ get_all,\ get_body,\ get_activeElement,\ get_images INTERFACE_DEF_LONG_MET,\ get_applets,\ get_links,\ get_forms,\ get_anchors,\ put_title,\ get_title,\ get_scripts,\ put_designMode,\ get_designMode INTERFACE_DEF_LONG_MET,\ get_selection,\ get_readyState,\ get_frames,\ get_embeds,\ get_plugins,\ put_alinkColor,\ get_alinkColor,\ put_bgColor,\ get_bgColor INTERFACE_DEF_LONG_MET,\ put_fgColor,\ get_fgColor,\ put_linkColor,\ get_linkColor,\ put_vlinkColor,\ get_vlinkColor,\ get_referrer,\ get_location,\ get_lastModified INTERFACE_DEF_LONG_MET,\ put_URL,\ get_URL,\ put_domain,\ get_domain,\ put_cookie,\ get_cookie,\ put_expando,\ get_expando,\ put_charset INTERFACE_DEF_LONG_MET,\ get_charset,\ put_defaultCharset,\ get_defaultCharset,\ get_mimeType,\ get_fileSize,\ get_fileCreatedDate,\ get_fileModifiedDate,\ get_fileUpdatedDate,\ get_security INTERFACE_DEF_LONG_MET,\ get_protocol,\ get_nameProp,\ write,\ writeln,\ open,\ close,\ clear,\ queryCommandSupported,\ queryCommandEnabled INTERFACE_DEF_LONG_MET,\ queryCommandState,\ queryCommandIndeterm,\ queryCommandText,\ queryCommandValue,\ execCommand,\ execCommandShowHelp,\ createElement,\ put_onhelp,\ get_onhelp INTERFACE_DEF_LONG_MET,\ put_onclick,\ get_onclick,\ put_ondblclick,\ get_ondblclick,\ put_onkeyup,\ get_onkeyup,\ put_onkeydown,\ get_onkeydown,\ put_onkeypress INTERFACE_DEF_LONG_MET,\ get_onkeypress,\ put_onmouseup,\ get_onmouseup,\ put_onmousedown,\ get_onmousedown,\ put_onmousemove,\ get_onmousemove,\ put_onmouseout,\ get_onmouseout INTERFACE_DEF_LONG_MET,\ put_onmouseover,\ get_onmouseover,\ put_onreadystatechange,\ get_onreadystatechange,\ put_onafterupdate,\ get_onafterupdate,\ put_onrowexit,\ get_onrowexit,\ put_onrowenter INTERFACE_DEF_LONG_MET,\ get_onrowenter,\ put_ondragstart,\ get_ondragstart,\ put_onselectstart,\ get_onselectstart,\ elementFromPoint,\ get_parentWindow,\ get_styleSheets,\ put_onbeforeupdate INTERFACE_DEF_LONG_MET,\ get_onbeforeupdate,\ put_onerrorupdate,\ get_onerrorupdate,\ toString,\ createStyleSheet INTERFACE_DEF_LONG_END IHTMLDocument2 WM_GO = WM_USER+666 ID_DLG_MAIN = 100 ID_EDIT = 1000 CIEB_CREATE = 00000001h CIEB_RESIZE = 00000002h CIEB_NAVIGATE = 00000003h CIEB_WAITREADY = 00000004h CIEB_DESTROY = 000000FFh ;;; .data? .data? hInstance dd ? mainHWND dd ? hEdit dd ? msg MSG<> oldAddbarEditWndProc dd ? oleExists dd ? rcOLE RECT <?> ppw IWebBrowser2 <?> ppo IOleObject <?> ppoipo IOleInPlaceObject <?> szBuf db 1024 dup(?) uszBuf dw 1024 dup(?)
;;; .data .data szAppTitle db "KaKeeware Browser",NULL szWWW db 'http://www.kakeeware.com',NULL IF BROWSER eq 0 XID CLSID_WebBrowser ,'8856F961-340A-11D0-A96B-00C04FD705A2' ELSE XID CLSID_WebBrowser ,'1339B54C-3453-11D2-93B9-000000000000' ENDIF XID IID_IWebBrowser2 ,'D30C1661-CDAF-11D0-8A3E-00C04FC9E26E' XID IID_IOleObject ,'00000112-0000-0000-C000-000000000046' XID IID_IOleInPlaceObject ,'00000113-0000-0000-C000-000000000046' XID IID_IOleInPlaceSite ,'00000119-0000-0000-C000-000000000046' XID IID_IHTMLDocument2 ,'332C4425-26CB-11D0-B483-00C04FD90119' UNI navABOUTBLANKURL,<about:blank> mIOleClientSite label dword dd OFS mIOleClientSite_QueryInterface dd OFS _AddRef dd OFS _Release dd OFS mIOleClientSite_SaveObject dd OFS mIOleClientSite_GetMoniker dd OFS mIOleClientSite_GetContainer dd OFS mIOleClientSite_ShowObject dd OFS mIOleClientSite_OnShowWindow dd OFS mIOleClientSite_RequestNewObjectLayout pmIOleClientSite dd OFS mIOleClientSite mIOleInPlaceSite label DWORD ; IOleInPlaceSite dd OFS mIOleInPlaceSite_QueryInterface dd OFS _AddRef dd OFS _Release dd OFS mIOleInPlaceSite_GetWindow dd OFS mIOleInPlaceSite_ContextSensitiveHelp dd OFS mIOleInPlaceSite_CanInPlaceActivate dd OFS mIOleInPlaceSite_OnInPlaceActivate dd OFS mIOleInPlaceSite_OnUIActivate dd OFS mIOleInPlaceSite_GetWindowContext dd OFS mIOleInPlaceSite_Scroll dd OFS mIOleInPlaceSite_OnUIDeactivate dd OFS mIOleInPlaceSite_OnInPlaceDeactivate dd OFS mIOleInPlaceSite_DiscardUndoState dd OFS mIOleInPlaceSite_DeactivateAndUndo dd OFS mIOleInPlaceSite_OnPosRectChange pmIOleInPlaceSite dd OFS mIOleInPlaceSite
;;; .code .code ;-- IOleClientSite ; _AddRef proc t:DWORD _AddRef: xor eax,eax inc eax ret 4
; _Release proc t:DWORD _Release: xor eax,eax ret 4
mIOleClientSite_QueryInterface proc uses esi edi ecx t,riid,ppvObject:DWORD mov esi,riid mov edi,OFS IID_IOleInPlaceSite cld mov ecx,4 repz cmpsb jnz @f MOP ppvObject,OFS pmIOleInPlaceSite mov eax,S_OK ret
@@: MOP ppvObject,NULL mov eax,E_NOINTERFACE ret
mIOleClientSite_QueryInterface endp
; mIOleClientSite_GetMoniker proc t,dwAssign,dwWhichMoniker,ppmk:DWORD mIOleClientSite_GetMoniker: mov eax,E_NOTIMPL ret 16
mIOleClientSite_GetContainer proc t,ppContainer:DWORD MOP ppContainer,NULL mov eax,E_NOINTERFACE ret mIOleClientSite_GetContainer endp
; mIOleClientSite_OnShowWindow proc t,fShow:DWORD mIOleClientSite_OnShowWindow: ; mIOleInPlaceSite_ContextSensitiveHelp proc t,fEnterMode:DWORD mIOleInPlaceSite_ContextSensitiveHelp: ; mIOleInPlaceSite_Scroll proc t,scrollExtant:DWORD mIOleInPlaceSite_Scroll: ; mIOleInPlaceSite_OnUIDeactivate proc t,fUndoable:DWORD mIOleInPlaceSite_OnUIDeactivate: ; mIOleInPlaceSite_OnPosRectChange proc t,lprcPosRect:DWORD mIOleInPlaceSite_OnPosRectChange: mov eax,S_OK ret 8
; mIOleInPlaceSite_OnInPlaceDeactivate proc t:DWORD mIOleInPlaceSite_OnInPlaceDeactivate: ; mIOleInPlaceSite_DiscardUndoState proc t:DWORD mIOleInPlaceSite_DiscardUndoState: ; mIOleInPlaceSite_DeactivateAndUndo proc t:DWORD mIOleInPlaceSite_DeactivateAndUndo: ; mIOleClientSite_SaveObject proc t:DWORD mIOleClientSite_SaveObject: ; mIOleClientSite_ShowObject proc t:DWORD mIOleClientSite_ShowObject: ; mIOleInPlaceSite_CanInPlaceActivate proc t:DWORD mIOleInPlaceSite_CanInPlaceActivate: ; mIOleInPlaceSite_OnUIActivate proc t:DWORD mIOleInPlaceSite_OnUIActivate: ; mIOleInPlaceSite_OnInPlaceActivate proc t:DWORD mIOleInPlaceSite_OnInPlaceActivate: mov eax,S_OK ret 4
; mIOleClientSite_RequestNewObjectLayout proc t:DWORD mIOleClientSite_RequestNewObjectLayout: mov eax,E_NOTIMPL ret 4 ;-- IOleInPlaceSite
mIOleInPlaceSite_QueryInterface proc t,riid,ppvObject:DWORD MOP ppvObject,NULL mov eax,E_NOINTERFACE ret mIOleInPlaceSite_QueryInterface endp
mIOleInPlaceSite_GetWindow proc t,phwnd:DWORD MOP phwnd,mainHWND mov eax,S_OK ret mIOleInPlaceSite_GetWindow endp
mIOleInPlaceSite_GetWindowContext proc t,ppFrame,ppDoc,\ lprcPosRect,lprcClipRect,\ lpFrameInfo:DWORD MOP ppFrame,NULL MOP ppDoc,NULL
INV GetClientRect,mainHWND,OFS rcOLE add rcOLE.top,28 add rcOLE.left,2 sub rcOLE.bottom,2 sub rcOLE.right,2 mov eax,lprcPosRect MOM [eax.RECT.left],rcOLE.left MOM [eax.RECT.top],rcOLE.top MOM [eax.RECT.right],rcOLE.right MOM [eax.RECT.bottom],rcOLE.bottom mov eax,lprcClipRect MOM [eax.RECT.left],rcOLE.left MOM [eax.RECT.top],rcOLE.top MOM [eax.RECT.right],rcOLE.right MOM [eax.RECT.bottom],rcOLE.bottom
mov eax,lpFrameInfo mov [eax.OLEINPLACEFRAMEINFO.fMDIApp],FALSE MOM [eax.OLEINPLACEFRAMEINFO.hwndFrame],mainHWND mov [eax.OLEINPLACEFRAMEINFO.haccel],NULL mov [eax.OLEINPLACEFRAMEINFO.cAccelEntries],0
mov eax,S_OK ret mIOleInPlaceSite_GetWindowContext endp
CreateOLEControl_WebBrowser2 proc bWhat,xParam:DWORD LOCAL waitingReadyCnt,lpVarVar,lpSafeArray,bstrStr,ourStr,pDoc,pHTML2:DWORD mov eax,bWhat .IF oleExists==FALSE && eax!=CIEB_CREATE ret .ENDIF .IF eax==CIEB_CREATE
INV CoCreateInstance,OFS CLSID_WebBrowser,NULL,\ CLSCTX_INPROC,OFS IID_IWebBrowser2,ADDR ppw .IF eax==S_OK
COM ppw,IWebBrowser2::QueryInterface,\ OFS IID_IOleObject,OFS ppo
.IF eax==S_OK INV OleSetContainedObject,DPTR [ppw],TRUE COM ppo,IOleObject::SetClientSite,OFS pmIOleClientSite COM ppo,IOleObject::DoVerb,OLEIVERB_INPLACEACTIVATE,\ NULL,OFS pmIOleClientSite,NULL,mainHWND,OFS rcOLE xor eax,eax inc eax mov oleExists,eax INV CreateOLEControl_WebBrowser2,CIEB_NAVIGATE,OFS navABOUTBLANKURL
.endif COM ppo,IOleObject::Release .endif
.ELSEIF eax==CIEB_NAVIGATE INV CreateOLEControl_WebBrowser2,CIEB_WAITREADY,0 xor eax,eax COM ppw,IWebBrowser2::Navigate,xParam,eax,eax,eax,eax INV CreateOLEControl_WebBrowser2,CIEB_WAITREADY,0
.ELSEIF eax==CIEB_WAITREADY xor eax,eax mov waitingReadyCnt,eax mov pDoc,eax COM ppw,IWebBrowser2::get_Document,ADDR pDoc .if (pDoc!=0) && (eax==S_OK) mov pHTML2,0 COM pDoc,IDispatch::QueryInterface,\ OFS IID_IHTMLDocument2,ADDR pHTML2 .IF (pHTML2!=0)&&(eax==S_OK) CreateOLEControl_WebBrowser2_WaitForReady: COM ppw,IWebBrowser2::get_ReadyState,ADDR bstrStr cmp DPTR bstrStr,2 jae CreateOLEControl_WebBrowser2_ready cmp waitingReadyCnt,100 ;sec. jae CreateOLEControl_WebBrowser2_ready inc waitingReadyCnt
PumpMsgs: INV PeekMessage,ADDR msg,NULL,0,0,PM_REMOVE .IF eax>0 INV TranslateMessage,ADDR msg INV DispatchMessage,ADDR msg jmp PumpMsgs .ENDIF
INV Sleep,10 jmp CreateOLEControl_WebBrowser2_WaitForReady
CreateOLEControl_WebBrowser2_ready:
COM pHTML2,IHTMLDocument2::Release .ENDIF ; INV IWebBrowser2_GetIHTMLDocument2
COM pDoc,IDispatch::Release .ENDIF ; INV IWebBrowser2_GetDocument
.ELSEIF eax==CIEB_RESIZE
INV CreateOLEControl_WebBrowser2,CIEB_WAITREADY,0 COM ppw,IWebBrowser2::QueryInterface,\ OFS IID_IOleInPlaceObject,OFS ppoipo .IF eax==S_OK COM ppoipo,IOleInPlaceObject::SetObjectRects,OFS rcOLE,OFS rcOLE COM ppoipo,IOleInPlaceObject::Release .ENDIF
.ELSEIF eax==CIEB_DESTROY .IF ppw!=0 && ppo!=0 mov oleExists,FALSE COM ppw,IWebBrowser2::Stop COM ppo,IOleObject::Close,FALSE COM ppo,IOleObject::Release COM ppw,IWebBrowser2::Release .ENDIF .ENDIF ret CreateOLEControl_WebBrowser2 endp addbarEditWndProc proc hEdt,uMsg,wPa,lPa:DWORD .IF uMsg==WM_GETDLGCODE mov eax,DLGC_WANTALLKEYS ret .ELSEIF uMsg==WM_KEYDOWN mov eax,wPa .if al==VK_RETURN INV PostMessage,mainHWND,WM_GO,0,0 xor eax,eax ret .endif .ELSEIF uMsg==WM_CHAR mov eax,wPa .if al==VK_RETURN xor eax,eax ret .endif .ENDIF INV CallWindowProc,oldAddbarEditWndProc,hEdt,uMsg,wPa,lPa ret addbarEditWndProc endp DlgProc proc hDlg,uMsg,wParam,lParam:DWORD mov eax,uMsg .IF eax==WM_CLOSE INV ShowWindow,hDlg,SW_HIDE INV CreateOLEControl_WebBrowser2,CIEB_DESTROY,0 INV OleUninitialize INV EndDialog,hDlg,0
.ELSEIF eax==WM_SIZE INV GetClientRect,hDlg,OFS rcOLE mov edx,rcOLE.top add rcOLE.top,2 add rcOLE.left,2 sub rcOLE.bottom,2 sub rcOLE.right,4 mov edx,rcOLE.top add edx,20 INV MoveWindow,hEdit,rcOLE.left,rcOLE.top,rcOLE.right,edx,TRUE add rcOLE.top,26 add rcOLE.right,2 INV CreateOLEControl_WebBrowser2,CIEB_RESIZE,0 .ELSEIF eax==WM_GO INV GetDlgItemText,hDlg,ID_EDIT,OFS szBuf,SIZEOF szBuf INV MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED,OFS szBuf,-1,OFS uszBuf,SIZEOF szBuf INV SetFocus,hEdit INV CreateOLEControl_WebBrowser2,CIEB_NAVIGATE,OFS uszBuf
.ELSEIF eax==WM_INITDIALOG INV SendMessage,hDlg,WM_SETTEXT,0,OFS szAppTitle INV GetDlgItem,hDlg,ID_EDIT mov hEdit,eax INV SendMessage,hEdit,WM_SETTEXT,0,OFS szWWW INV SetWindowLong,hEdit,GWL_WNDPROC,OFS addbarEditWndProc mov oldAddbarEditWndProc,eax INV OleInitialize,NULL MOM mainHWND,hDlg INV CreateOLEControl_WebBrowser2,CIEB_CREATE,0
.ELSEIF eax==WM_COMMAND cmp wParam,IDOK jnz @f INV SendMessage,hDlg,WM_CLOSE,0,0 @@:
.ENDIF xor eax,eax ret DlgProc endp
Start: INV GetModuleHandle,NULL mov hInstance,eax INV DialogBoxParam,hInstance,ID_DLG_MAIN,0,ADDR DlgProc,0 INV ExitProcess,0 END Start
|
|