;web_fasm.asm
format PE GUI 4.0
entry start
include 'win32ax.inc'
;

section '.idata' import data readable
library kernel32,'KERNEL32.DLL',\
	user32,'USER32.DLL',\
	ole,'OLE32.DLL'
import ole,\
	CoInitialize,'CoInitialize',\
	OleInitialize,'OleInitialize',\
	OleUninitialize,'OleUninitialize',\
	OleSetContainedObject,'OleSetContainedObject',\
	CoCreateInstance,'CoCreateInstance'
include 'api\kernel32.inc'
include 'api\user32.inc'
;
S_OK equ 0h
E_UNEXPECTED equ 8000FFFFh
E_NOINTERFACE equ 80004002h
E_NOTIMPL equ 80004001h
CLSCTX_INPROC_SERVER equ 1
CLSCTX_INPROC_HANDLER equ 2
OLEIVERB_INPLACEACTIVATE equ -5
CLSCTX_INPROC equ CLSCTX_INPROC_SERVER or CLSCTX_INPROC_HANDLER
INV fix invoke
MOM fix MOVM
macro MOVM dokad,skad
{
	push  skad
	pop dokad
}
macro MOP dokad,co
{
	mov [dokad],co
	;mov eax,dokad
	;MOVM [eax],co
}
;
interface IOleObject,\
	SetClientSite,\
	DoVerb,\
	Release,\
	SetHostNames,\
	Close,\
	Advise
;
interface IWebBrowser2,\
	QueryInterface,\
	Release,\
	GetTypeInfoCount,\
	GetTypeInfo,\
	GetIDsOfNames,\
	xInvoke,\
	GoBack,\
	GoForward,\
	GoHome,\
	GoSearch,\
	Navigate,\
	Refresh,\
	Refresh2,\
	Stop,\
	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,\
	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,\
	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,\
	get_RegisterAsDropTarget,\
	put_RegisterAsDropTarget,\
	get_TheaterMode,\
	put_TheaterMode,\
	get_AddressBar,\
	put_AddressBar,\
	get_Resizable,\
	put_Resizable
;
struct OLEINPLACEFRAMEINFO
	cb			dd ?
	fMDIApp	dd ?
	hwndFrame	dd ?
	haccel		dd ?
	cAccelEntries dd ?
ends
;
struc GUID def
{
	match d1-d2-d3-d4-d5, def
	\{
	.Data1 dd 0x\#d1
	.Data2 dw 0x\#d2
	.Data3 dw 0x\#d3
	.Data4 db 0x\#d4 shr 8,0x\#d4 and 0FFh
	.Data5 db 0x\#d5 shr 40,0x\#d5 shr 32 and 0FFh,0x\#d5 shr 24 and 0FFh,0x\#d5 shr 16 and 0FFh,0x\#d5 shr 8 and 0FFh,0x\#d5 and 0FFh
	\}
}
ID_DLG_MAIN	= 100
ID_CHANGE	= 1002
.data							; dane zainicjalizowane
hInstance dd ?
hMainWnd dd ?
; identyfikatory GUID
CLSID_WebBrowser	GUID 8856F961-340A-11D0-A96B-00C04FD705A2
IID_IWebBrowser2	GUID D30C1661-CDAF-11D0-8A3E-00C04FC9E26E
IID_IOleObject		GUID 00000112-0000-0000-C000-000000000046
IID_IOleInPlaceObject GUID 00000113-0000-0000-C000-000000000046
IID_IOleInPlaceSite	GUID 00000119-0000-0000-C000-000000000046
IID_IOleClientSite	GUID 00000118-0000-0000-C000-000000000046
bJestOLE	dd FALSE
szPokaz	db 'Open...',0
szUkryj	db 'Close..',0
uniNULL du 0
navURL db "http://localhost/",0
VT_I4				equ 3
vnavFlags	dw VT_I4,0,0,0
			dw FALSE
VT_BSTR			equ 8
vnavTarget	dw VT_BSTR,0,0,0
		dd NULL
vnavPostData dw 0,0,0,0
		dd 0
vnavHeaders dw VT_BSTR,0,0,0
			dd NULL

rcOLE RECT 0,0,100,100
;-- tablice metod wirtualnych
label mIOleClientSite :dword ; IOleClientSite
	dd mIOleClientSite_QueryInterface
	dd mIOleClientSite_AddRef
	dd mIOleClientSite_Release
	dd mIOleClientSite_SaveObject
	dd mIOleClientSite_GetMoniker
	dd mIOleClientSite_GetContainer
	dd mIOleClientSite_ShowObject
	dd mIOleClientSite_OnShowWindow
	dd mIOleClientSite_RequestNewObjectLayout
label mIOleInPlaceSite :dword ; IOleInPlaceSite
	dd mIOleInPlaceSite_QueryInterface
	dd mIOleInPlaceSite_AddRef
	dd mIOleInPlaceSite_Release
	dd mIOleInPlaceSite_GetWindow
	dd mIOleInPlaceSite_ContextSensitiveHelp
	dd mIOleInPlaceSite_CanInPlaceActivate
	dd mIOleInPlaceSite_OnInPlaceActivate
	dd mIOleInPlaceSite_OnUIActivate
	dd mIOleInPlaceSite_GetWindowContext
	dd mIOleInPlaceSite_Scroll
	dd mIOleInPlaceSite_OnUIDeactivate
	dd mIOleInPlaceSite_OnInPlaceDeactivate
	dd mIOleInPlaceSite_DiscardUndoState
	dd mIOleInPlaceSite_DeactivateAndUndo
	dd mIOleInPlaceSite_OnPosRectChange
pmIOleClientSite dd mIOleClientSite
pmIOleInPlaceSite dd mIOleInPlaceSite
ppw IWebBrowser2	;<0>
ppo IOleObject	;<0>
.code							; segment kodu (sekcja kodu)
proc cmpGUID uses esi edi,guid1,guid2:DWORD
	mov esi,[guid1]
	mov edi,[guid2]
	mov eax,[esi]
	cmp eax,[edi]
	jne cmpGUID_ret1
	mov eax,[esi+4]
	cmp eax,[edi+4]
	jne cmpGUID_ret1
	mov eax,[esi+8]
	cmp eax,[edi+8]
	jne cmpGUID_ret1
	mov eax,[esi+12]
	cmp eax,[edi+12]
	;jne cmpGUID_ret1
	;cmpGUID_ret0:
	;xor eax,eax
	;ret
	cmpGUID_ret1:
	xor eax,eax
	inc eax
	ret
endp
;-- IOleClientSite
proc mIOleClientSite_QueryInterface t,riid,ppvObject:DWORD

	stdcall cmpGUID,[riid],IID_IOleInPlaceSite
	.if eax=0
		MOP ppvObject,pmIOleInPlaceSite
		mov eax,S_OK
	.else
		MOP ppvObject,NULL
		mov eax,E_NOINTERFACE
	.endif
	ret
endp
;
proc mIOleClientSite_AddRef t:DWORD
	xor eax,eax
	inc eax
	ret
endp
;
proc mIOleClientSite_Release t:DWORD
	xor eax,eax
	ret
endp
;
proc mIOleClientSite_SaveObject t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleClientSite_GetMoniker t,dwAssign,\
							dwWhichMoniker,ppmk:DWORD
	mov eax,E_NOTIMPL
	ret
endp
;
proc mIOleClientSite_GetContainer t,ppContainer:DWORD
	MOP ppContainer,NULL
	mov eax,E_NOINTERFACE
	ret
endp
;
proc mIOleClientSite_ShowObject	t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleClientSite_OnShowWindow t,fShow:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleClientSite_RequestNewObjectLayout t:DWORD
	mov eax,E_NOTIMPL
	ret
endp
;-- IOleInPlaceSite
proc mIOleInPlaceSite_QueryInterface t,riid,ppvObject:DWORD
	MOP ppvObject,NULL
	mov eax,E_NOINTERFACE
	ret
endp
;
proc mIOleInPlaceSite_AddRef t:DWORD
	xor eax,eax
	inc eax
	ret
endp
;
proc mIOleInPlaceSite_Release t:DWORD
	xor eax,eax
	ret
endp
;
proc mIOleInPlaceSite_GetWindow t,phwnd:DWORD
	MOP phwnd,hMainWnd
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_ContextSensitiveHelp t,fEnterMode:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_CanInPlaceActivate t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_OnInPlaceActivate t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_OnUIActivate t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_GetWindowContext t,ppFrame,ppDoc,\
		lprcPosRect,lprcClipRect,lpFrameInfo:DWORD
	MOP ppFrame,NULL
	MOP ppDoc,NULL
	INV GetClientRect,[hMainWnd],rcOLE
	add [rcOLE.top],1
	add [rcOLE.left],1
	sub [rcOLE.bottom],40
	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],[hMainWnd]
	mov [eax+OLEINPLACEFRAMEINFO.haccel],NULL
	mov [eax+OLEINPLACEFRAMEINFO.cAccelEntries],0
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_Scroll t,scrollExtant:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_OnUIDeactivate t,fUndoable:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_OnInPlaceDeactivate t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_DiscardUndoState t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_DeactivateAndUndo t:DWORD
	mov eax,S_OK
	ret
endp
;
proc mIOleInPlaceSite_OnPosRectChange t,lprcPosRect:DWORD
	mov eax,S_OK
	ret
endp
;
proc CreateOLEControl_WebBrowser2 bWhat:DWORD
	.if [bWhat] = TRUE
		INV CoCreateInstance,CLSID_WebBrowser,NULL,CLSCTX_INPROC,IID_IWebBrowser2,ppw
		.if eax=S_OK
			cominvk ppw,QueryInterface,IID_IOleObject,ppo
			.if eax=S_OK
				INV OleSetContainedObject,[ppw],TRUE
				cominvk ppo,SetClientSite,pmIOleClientSite
				;****The following two lines have no error, but without ideal results.
				cominvk ppo,DoVerb,OLEIVERB_INPLACEACTIVATE,NULL,pmIOleClientSite,NULL,[hMainWnd],rcOLE
				cominvk ppw,Navigate,navURL,vnavFlags,vnavTarget,vnavPostData,vnavHeaders
			.endif
		.endif
	.else
		.if [ppw]<>0 & [ppo]<>0
			cominvk ppw,Stop
			cominvk ppo,Close,FALSE
			cominvk ppo,Release
			cominvk ppw,Release
			mov [ppw],0
			mov [ppo],0
		.endif
	.endif
	ret
endp
;
proc DlgProc hDlg,uMsg,wParam,lParam:DWORD
	pushad
	.if [uMsg]=WM_CLOSE
		stdcall CreateOLEControl_WebBrowser2,FALSE
		INV OleUninitialize
		INV EndDialog,[hMainWnd],0
	.elseif [uMsg]=WM_INITDIALOG
		INV OleInitialize,NULL
		INV SetDlgItemText,[hDlg],ID_CHANGE,szPokaz
		MOM [hMainWnd],[hDlg]
	.elseif [uMsg]=WM_COMMAND
		.if [wParam]=IDOK
			INV SendMessage,[hMainWnd],WM_CLOSE,0,0
		.elseif [wParam]=ID_CHANGE
			inc	[bJestOLE]	; \ na przemian widoczna/
			and [bJestOLE],1	; / niewidoczna
			mov eax,[bJestOLE] ; eax=0 lub 1
			lea	eax,[eax*8+szPokaz]
			INV SetDlgItemText,[hMainWnd],ID_CHANGE,eax
			stdcall CreateOLEControl_WebBrowser2,[bJestOLE]
		.endif
	.endif
	popad
	xor eax,eax
	ret
endp
;
start:					; pocztek programu
	invoke GetModuleHandle,NULL
	mov [hInstance],eax
	invoke DialogBoxParam,[hInstance],ID_DLG_MAIN,0,DlgProc,0
	invoke ExitProcess,0			; powr¨®t z programu
;
section '.rsrc' resource data readable
directory RT_DIALOG,dialogs
resource dialogs,\
	ID_DLG_MAIN,LANG_ENGLISH+SUBLANG_DEFAULT,DlgMain
;
dialog DlgMain,'Taskbar control',0, 0, 268, 174,DS_CENTER+WS_POPUP+WS_CAPTION+WS_SYSMENU
	dialogitem 'BUTTON','OK',IDOK,211,154,50,14,WS_VISIBLE+WS_TABSTOP
	dialogitem 'BUTTON','',ID_CHANGE,90,153,86,15,WS_VISIBLE+WS_TABSTOP
enddialog

