📄 asmctrl.asm
字号:
invoke DefWindowProc, hwnd, message, wparam.value, lparam.value
ret
.ENDIF
xor eax, eax
ret
aboutBoxProc ENDP
;--------------------------------------------------------------------------
SendViewChange PROC this_:DWORD
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_pViewAdviseSink
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pViewAdviseSink, IAdviseSink, OnViewChange, DVASPECT_CONTENT, -1
.ENDIF
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_advf
and eax, ADVF_ONLYONCE
.IF eax
invoke ComPtrAssign, ADDR (AsmCtrlData ptr [ecx]).m_pViewAdviseSink, NULL
mov (AsmCtrlData ptr [ecx]).m_advf, NULL
.ENDIF
ret
SendViewChange ENDP
;--------------------------------------------------------------------------
;IOleObject
;--------------------------------------------------------------------------
IOleObject_SetClientSite PROC this_:DWORD, pClientSite:DWORD
pObjectData this_, ecx
invoke ComPtrAssign, ADDR (AsmCtrlData ptr [ecx]).m_pClientSite, pClientSite
xor eax, eax ; return S_OK
ret
IOleObject_SetClientSite ENDP
;--------------------------------------------------------------------------
IOleObject_GetClientSite PROC this_:DWORD, ppClientSite:DWORD
.IF !ppClientSite
mov eax, E_POINTER
ret
.ENDIF
pObjectData this_, edx
invoke ComPtrAssign, ppClientSite, (AsmCtrlData ptr [edx]).m_pClientSite
xor eax, eax ; return S_OK
ret
IOleObject_GetClientSite ENDP
;--------------------------------------------------------------------------
IOleObject_SetHostNames PROC this_:DWORD, lpcolestr:DWORD
xor eax, eax ; return S_OK
ret
IOleObject_SetHostNames ENDP
;--------------------------------------------------------------------------
IOleObject_Close PROC this_:DWORD, dwSaveOption:DWORD
LOCAL pBase:DWORD
pObjectData this_, ecx
mov pBase, ecx
.IF (dwSaveOption == OLECLOSE_SAVEIFDIRTY) || (dwSaveOption == OLECLOSE_PROMPTSAVE)
mov eax, (AsmCtrlData ptr [ecx]).m_isDirty
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pClientSite, IOleClientSite, SaveObject
.ENDIF
.ENDIF
mov ecx, pBase
mov eax, (AsmCtrlData ptr [ecx]).m_pViewAdviseSink
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pViewAdviseSink, IAdviseSink, OnClose
.ENDIF
mov ecx, pBase
mov eax, (AsmCtrlData ptr [ecx]).m_pAdviseHolder
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pAdviseHolder, IOleAdviseHolder, SendOnClose
.ENDIF
mov ecx, pBase
mov eax, (AsmCtrlData ptr [ecx]).m_pClientSite
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pClientSite, IOleClientSite, Release
.ENDIF
xor eax, eax ; return S_OK
ret
IOleObject_Close ENDP
;--------------------------------------------------------------------------
IOleObject_SetMoniker PROC this_:DWORD, IMoniker:DWORD
mov eax, E_NOTIMPL
ret
IOleObject_SetMoniker ENDP
;--------------------------------------------------------------------------
IOleObject_GetMoniker PROC this_:DWORD, A1:DWORD, A2:DWORD, ppMoniker:DWORD
.IF ppMoniker
mov ecx, ppMoniker ; NULL the pointer sent us
xor eax, eax
mov [ecx], eax
.ENDIF
mov eax, E_NOTIMPL
ret
IOleObject_GetMoniker ENDP
;--------------------------------------------------------------------------
IOleObject_InitFromData PROC this_:DWORD, pIDataObject:DWORD, A1:BOOL, A2:DWORD
mov eax, E_NOTIMPL
ret
IOleObject_InitFromData ENDP
;--------------------------------------------------------------------------
IOleObject_GetClipboardData PROC this_:DWORD, A1:DWORD, pIDataObject:DWORD
mov eax, E_NOTIMPL
ret
IOleObject_GetClipboardData ENDP
;--------------------------------------------------------------------------
IOleObject_DoVerb PROC this_:DWORD, iVerb:DWORD, lpmsg:MSG, pIOleClientSite:DWORD, lindex:DWORD, hwndParent:DWORD, lprcPosRect:DWORD
LOCAL pControlSite:DWORD, hr:DWORD
.IF iVerb == OLEIVERB_PROPERTIES
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_pClientSite
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pClientSite, IOleClientSite, QueryInterface, pIID_IOleControlSite, ADDR pControlSite
.IF_SUCCEEDED
coinvoke pControlSite, IOleControlSite, ShowPropertyFrame
ret
.ELSE
mov eax, E_FAIL
ret
.ENDIF
.ENDIF
.ELSEIF iVerb == 1 ; requested the AboutBox
invoke AboutBox, this_
mov eax, eax ; return S_OK
.ENDIF
ret
IOleObject_DoVerb ENDP
;--------------------------------------------------------------------------
IOleObject_EnumVerbs PROC this_:DWORD, pIEnumOLEVERB:DWORD
invoke OleRegEnumVerbs, pCLSID_AsmCtrl, pIEnumOLEVERB
ret
IOleObject_EnumVerbs ENDP
;--------------------------------------------------------------------------
IOleObject_Update PROC this_:DWORD
xor eax, eax ; return S_OK
ret
IOleObject_Update ENDP
;--------------------------------------------------------------------------
IOleObject_IsUpToDate PROC this_:DWORD
xor eax, eax ; return S_OK
ret
IOleObject_IsUpToDate ENDP
;--------------------------------------------------------------------------
IOleObject_GetUserClassID PROC this_:DWORD, pClsid:DWORD
.IF !pClsid
mov eax, E_POINTER
ret
.ENDIF
mov ecx, pClsid
mov eax, pCLSID_AsmCtrl
mov [ecx], eax
xor eax, eax ; return S_OK
ret
IOleObject_GetUserClassID ENDP
;--------------------------------------------------------------------------
IOleObject_GetUserType PROC this_:DWORD, dwFormOfType:DWORD, pszUserType:DWORD
invoke OleRegGetUserType, pCLSID_AsmCtrl, dwFormOfType, pszUserType
ret
IOleObject_GetUserType ENDP
;--------------------------------------------------------------------------
IOleObject_SetExtent PROC this_:DWORD, dwAspect:DWORD, pSizel:DWORD
LOCAL temp:DWORD
.IF !pSizel
mov eax, E_POINTER
ret
.ENDIF
.IF (dwAspect != DVASPECT_CONTENT)
mov eax, E_FAIL
.ELSE
pObjectData this_, edx
mov ecx, pSizel
; get 'x' extents
mov eax, (SIZEL PTR [ecx]).x
mov (AsmCtrlData ptr [edx]).m_himetricExtent.x, eax
; fninit ; init coprocessor
fild (SIZEL PTR [ecx]).x ; mov sizy.x to stack
fdiv HIMETRIC_PER_PIXEL ; divide by const
fistp temp ; get integer result (rounds it too)
mov eax, temp ; leave in reg
mov (AsmCtrlData ptr [edx]).m_pixelExtent.x, eax
.IF eax < 10
mov (AsmCtrlData ptr [edx]).m_pixelExtent.x, 10
mov (AsmCtrlData ptr [edx]).m_himetricExtent.x, 265
.ENDIF
; get 'y' extents
mov eax, (SIZEL PTR [ecx]).y
mov (AsmCtrlData ptr [edx]).m_himetricExtent.y, eax
; fninit ; init coprocessor
fild (SIZEL PTR [ecx]).y ; mov sizy.y to stack
fdiv HIMETRIC_PER_PIXEL ; divide by const
fistp temp ; get integer result (rounds it too)
mov eax, temp ; leave in reg
mov (AsmCtrlData ptr [edx]).m_pixelExtent.y, eax
.IF eax < 10
mov (AsmCtrlData ptr [edx]).m_pixelExtent.y, 10
mov (AsmCtrlData ptr [edx]).m_himetricExtent.y, 265
.ENDIF
xor eax, eax ; return S_OK
.ENDIF
ret
IOleObject_SetExtent ENDP
;--------------------------------------------------------------------------
;
;
; ;const float HIMETRIC_PER_PIXEL(26.4583333333f);
;
; HimetricToPixel PROC psize:DWORD
; LOCAL temp:DWORD
;
; ; convert psize to .x in eax, .y in ecx
; mov edx, psize
; FNINIT ; init coprocessor
; fild (SIZEL PTR [edx]).x ; mov sizy.x to stack
; fdiv HIMETRIC_PER_PIXEL ; divide by const
; fistp temp ; get integer result (rounds it too)
; mov eax, temp ; leave in reg
; fild (SIZEL PTR [edx]).y ; do same for sizy.y
; fdiv HIMETRIC_PER_PIXEL
; fistp temp
; mov ecx, temp
; ret
; HimetricToPixel ENDP
;
; PixelToHimetric PROC psize:DWORD
; LOCAL temp:DWORD
;
; ; convert psize to .x in eax, .y in ecx
; mov edx, psize
; FNINIT ; init coprocessor
; fild (SIZEL PTR [edx]).x ; mov sizy.x to stack
; fmul HIMETRIC_PER_PIXEL ; mult by const
; fistp temp ; get integer result (rounds it too)
; mov eax, temp ; leave in reg
; fild (SIZEL PTR [edx]).y ; do same for sizy.y
; fmul HIMETRIC_PER_PIXEL
; fistp temp
; mov ecx, temp
; ret
; PixelToHimetric ENDP
;
;--------------------------------------------------------------------------
IOleObject_GetExtent PROC this_:DWORD, dwAspect:DWORD, pSizel:DWORD
.IF !pSizel
mov eax, E_POINTER
ret
.ENDIF
.IF (dwAspect != DVASPECT_CONTENT)
mov eax, E_INVALIDARG
.ELSE
pObjectData this_, edx
mov ecx, pSizel
mov eax, (AsmCtrlData ptr [edx]).m_himetricExtent.x
mov (SIZEL PTR [ecx]).x, eax
mov eax, (AsmCtrlData ptr [edx]).m_himetricExtent.y
mov (SIZEL PTR [ecx]).y, eax
xor eax, eax ; return S_OK
.ENDIF
ret
IOleObject_GetExtent ENDP
;--------------------------------------------------------------------------
IOleObject_Advise PROC this_:DWORD, pAdvSink:DWORD, pdwConnection:DWORD
pObjectData this_, ecx
coinvoke (AsmCtrlData ptr [ecx]).m_pAdviseHolder, IOleAdviseHolder, Advise, pAdvSink, pdwConnection
ret
IOleObject_Advise ENDP
;--------------------------------------------------------------------------
IOleObject_Unadvise PROC this_:DWORD, dwConnection:DWORD
pObjectData this_, ecx
coinvoke (AsmCtrlData ptr [ecx]).m_pAdviseHolder, IOleAdviseHolder, Unadvise, dwConnection
ret
IOleObject_Unadvise ENDP
;--------------------------------------------------------------------------
IOleObject_EnumAdvise PROC this_:DWORD, ppEnumAdvise:DWORD
pObjectData this_, ecx
coinvoke (AsmCtrlData ptr [ecx]).m_pAdviseHolder, IOleAdviseHolder, EnumAdvise, ppEnumAdvise
ret
IOleObject_EnumAdvise ENDP
;--------------------------------------------------------------------------
IOleObject_GetMiscStatus PROC this_:DWORD, dwAspect:DWORD, pdwStatus:DWORD
mov ecx, pdwStatus
.IF !pdwStatus
mov eax, E_POINTER
ret
.ENDIF
.IF (dwAspect != DVASPECT_CONTENT)
xor eax, eax
mov [ecx], eax
mov eax, E_FAIL
.ELSE
mov eax, 131073
mov [ecx], eax
xor eax, eax ; return S_OK
.ENDIF
ret
IOleObject_GetMiscStatus ENDP
;--------------------------------------------------------------------------
IOleObject_SetColorScheme PROC this_:DWORD, plogpalette:DWORD
mov eax, E_NOTIMPL
ret
IOleObject_SetColorScheme ENDP
;--------------------------------------------------------------------------
;IProvideClassInfo
;--------------------------------------------------------------------------
IProvideClassInfo_GetClassInfo PROC this_:DWORD, ppTI:DWORD
.IF !ppTI
mov eax, E_POINTER
ret
.ENDIF
mov ecx, (ObjectEntry PTR this_).m_pBase
mov ecx, (ObjectData PTR [ecx]).m_pti
.IF !ecx
ret
.ENDIF
mov edx, ppTI
mov [edx], ecx
coinvoke ppTI, IUnknown, AddRef
xor eax, eax ; return S_OK
ret
IProvideClassInfo_GetClassInfo ENDP
;--------------------------------------------------------------------------
;IPersistStreamInit
;--------------------------------------------------------------------------
IPersist_GetClassID PROC this_:DWORD, pClassID:DWORD
.IF !pClassID
mov eax, E_POINTER
ret
.ENDIF
mov eax, pCLSID_AsmCtrl
mov [ecx], eax
xor eax, eax ; return S_OK
ret
IPersist_GetClassID ENDP
;--------------------------------------------------------------------------
IPersistStreamInit_IsDirty PROC this_:DWORD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -