📄 asmctrl.asm
字号:
; AsmCtrl.ocx copyright 7/24/00 Ernest J Murphy
.NOLIST ; keep the list file small, don't add the std libs to it.
.386
.model flat, stdcall
option casemap:none ; case sensitive
;--------------------------------------------------------------------------
;DEBUGL EQU 1
;--------------------------------------------------------------------------
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\masm32.inc
include \masm32\include\ole32.inc
include \masm32\include\gdi32.inc
include \masm32\com\include\oaidl.inc
include \masm32\com\include\L.inc
include \masm32\com\include\language.inc
include \masm32\com\include\colib.inc
include \masm32\com\include\olectl.inc
include \masm32\com\include\component.inc
include IAsmCtrl.inc
include AsmCtrl_vtable.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\ole32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\COM\colib\colib.lib
PUBLIC ClassMap
;--------------------------------------------------------------------------
.LISTALL ; NOW let's list everything
;--------------------------------------------------------------------------
.data
; describe the objects inside the DLL
ClassMap ClassItem \ ; class map instance
{ pCLSID_AsmCtrl, DISPINTERFACE + SUPPLY_TYPE_INFO, \
OFFSET AsmCtrlTypeLibInfo, OFFSET AsmCtrlIMap, \
OFFSET CreateAsmCtrl, OFFSET DestroyAsmCtrl, \
OFFSET AsmCtrlInitData, SIZEOF AsmCtrlObject }
END_CLASS_MAP
AsmCtrlIMap \
InterfaceItem { pIID_IAsmCtrl, OFFSET vtable.IAsmCtrl }
InterfaceItem { pIID_IOleObject, OFFSET vtable.IOleObject }
InterfaceItem { pIID_IProvideClassInfo, OFFSET vtable.IProvideClassInfo }
InterfaceItem { pIID_IPersist, OFFSET vtable.IPersist }
InterfaceItem { pIID_IPersistStreamInit, OFFSET vtable.IPersistStreamInit }
InterfaceItem { pIID_IViewObject, OFFSET vtable.IViewObject }
InterfaceItem { pIID_IViewObject2, OFFSET vtable.IViewObject }
; todo:
; InterfaceItem { pIID_ISpecifyPropertyPages, OFFSET vtable.ISpecifyPropertyPages }
InterfaceItem { pIID_IPersistPropertyBag, OFFSET vtable.IPersistPropertyBag }
InterfaceItem { pIID_ICategorizeProperties, OFFSET vtable.ICategorizeProperties }
END_INTERFACE_MAP
AsmCtrlTypeLibInfo TypeLibInfo {pLIBID_AsmCtrl, 1, 0}
AsmCtrlData STRUCT
m_isDirty DWORD 0
m_advf DWORD 0
m_pClientSite DWORD 0
m_pViewAdviseSink DWORD 0
m_pAdviseHolder DWORD 0
m_himetricExtent SIZEL {3968, 3968}
m_pixelExtent SIZEL {150, 150 }
m_Value DWORD 85
m_BackColor DWORD 0808080H
m_ForeColor DWORD 0FFFFFFH
AsmCtrlData ENDS
AsmCtrlObject STRUCT
ObjectData0 ObjectData { } ; base values
AsmCtrlData0 AsmCtrlData { } ; custom object data
ObjectEntry0 ObjectEntry { } ; delegated Unknown
ObjectEntry1 ObjectEntry { } ; IAsmCtrl
ObjectEntry2 ObjectEntry { } ; IOleObject
ObjectEntry3 ObjectEntry { } ; IProvideClassInfo
ObjectEntry4 ObjectEntry { } ; IPersist
ObjectEntry5 ObjectEntry { } ; IPersistStreamInit
ObjectEntry6 ObjectEntry { } ; IViewObject
ObjectEntry7 ObjectEntry { } ; IViewObject2
; todo:
; ObjectEntry8 ObjectEntry { } ; ISpecifyPropertyPages
ObjectEntry9 ObjectEntry { } ; IPersistPropertyBag
ObjectEntry10 ObjectEntry { } ; ICategorizeProperties
AsmCtrlObject ENDS
vtable _vtable {}
; define the interface IID's
DeclareGuid IID_IAsmCtrl
DeclareGuid CLSID_AsmCtrl
DeclareGuid LIBID_AsmCtrl
DeclareGuid IID_IOleObject
DeclareGuid IID_IProvideClassInfo
DeclareGuid IID_IPersist
DeclareGuid IID_IPersistStreamInit
DeclareGuid IID_IViewObject
DeclareGuid IID_IViewObject2
DeclareGuid IID_ISpecifyPropertyPages
DeclareGuid IID_IPersistPropertyBag
DeclareGuid IID_IOleControlSite
DeclareGuid IID_ICategorizeProperties
DeclareGuid IID_IOleWindow
DeclareGuid CLSID_StockFontPage
DeclareGuid CLSID_StockColorPage
HIMETRIC_PER_PIXEL REAL4 26.458333
packedDW UNION
value DWORD ?
STRUCT
loword WORD ?
hiword WORD ?
ENDS
packedDW ENDS
PropCatItem STRUCT
m_dispid DWORD 0
m_CatID DWORD 0
PropCatItem ENDS
CatNameItem STRUCT
m_CatID DWORD 0
m_ResourceID DWORD 0
CatNameItem ENDS
END_CAT_MAP MACRO
LOCAL NullCatItem
NullCatItem CatNameItem {0,0}
ENDM
AsmCtrlPropMap PropCatItem { 0, 1}
PropCatItem2 PropCatItem { 1, 1}
PropCatItem3 PropCatItem { DISPID_FORECOLOR, 1}
PropCatItem4 PropCatItem { DISPID_BACKCOLOR, 1}
PropCatItem5 PropCatItem { DISPID_ABOUTBOX, 1}
END_CAT_MAP
AsmCtrlCatNameMap PropCatItem { 1, IDS_AsmCtrl}
END_CAT_MAP
AsmCtrlInitData STRUCT
m_pAsmCtrlPropMap DWORD 0
m_pAsmCtrlCatNameMap DWORD 0
AsmCtrlInitData ENDS
IDD_ABOUT EQU 1000
IDC_OK EQU 1001
IDC_STATIC1 EQU 1002
IDC_STATIC2 EQU 1003
IDD_ABOUT_BITMAP EQU 1005
IDB_ABOUT EQU 2000
IDS_AsmCtrl EQU 3000
AsmCtrlInitData1 AsmCtrlInitData { OFFSET AsmCtrlPropMap, OFFSET AsmCtrlCatNameMap}
szClassName BYTE "ABOUT_MYCTRL2", 0
szAppName1 BYTE "About My Control", 0
szAbout BYTE "Super-cheap About box for My Control", 0
szName BYTE "My Control", 0
NameLength DWORD 10
szAboutBox byte "ABOUTBOX", 0
;IDC_OK EQU 1000
; names for storage values (in stream order)
wszValue wchar L(<Value\0>)
wszBackColor wchar L(<BackColor\0>)
wszForeColor wchar L(<ForeColor\0>)
; Property names
wszAsmCtrl wchar L(<Asm Control 2\0>)
;--------------------------------------------------------------------------
; prototypes
;HimetricToPixel PROTO :DWORD
;PixelToHimetric PROTO :DWORD
aboutBoxProc PROTO :DWORD, :DWORD, :packedDW, :packedDW
SendViewChange PROTO :DWORD
;--------------------------------------------------------------------------
.code
;--------------------------------------------------------------------------
;IAsmCtrl
CreateAsmCtrl PROC this_:DWORD
LOCAL pAH:DWORD
pObjectData this_, ecx ; cast this_ to CreateAsmCtrl object data
xor eax, eax ; get variable
mov pAH, eax
mov (AsmCtrlData ptr [ecx]).m_isDirty, eax
mov (AsmCtrlData ptr [ecx]).m_pClientSite, eax
mov (AsmCtrlData ptr [ecx]).m_pViewAdviseSink, eax
mov (AsmCtrlData ptr [ecx]).m_pAdviseHolder, eax
mov (AsmCtrlData ptr [ecx]).m_himetricExtent.x, eax
mov (AsmCtrlData ptr [ecx]).m_himetricExtent.y, eax
mov (AsmCtrlData ptr [ecx]).m_pixelExtent.x, eax
mov (AsmCtrlData ptr [ecx]).m_pixelExtent.y, eax
mov (AsmCtrlData ptr [ecx]).m_Value, eax
invoke CreateOleAdviseHolder, ADDR pAH
xor eax, eax ; return S_OK
ret
CreateAsmCtrl ENDP
;--------------------------------------------------------------------------
DestroyAsmCtrl PROC this_:DWORD
LOCAL pBase:DWORD
pObjectData this_, ecx ; cast this_ to CreateAsmCtrl object data
mov pBase, ecx
mov ecx, pBase
invoke ComPtrAssign, ADDR (AsmCtrlData ptr [ecx]).m_pClientSite, NULL
mov ecx, pBase
invoke ComPtrAssign, ADDR (AsmCtrlData ptr [ecx]).m_pViewAdviseSink, NULL
mov ecx, pBase
mov eax, (AsmCtrlData ptr [ecx]).m_pAdviseHolder
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pAdviseHolder, IUnknown, Release
.ENDIF
mov ecx, pBase
xor eax, eax ; return S_OK
ret
DestroyAsmCtrl ENDP
;--------------------------------------------------------------------------
put_Value PROC this_:DWORD, newVal:DWORD
pObjectData this_, edx
mov (AsmCtrlData ptr [edx]).m_isDirty, TRUE
mov eax, newVal
mov (AsmCtrlData ptr [edx]).m_Value, eax
xor eax, eax
ret
put_Value ENDP
;--------------------------------------------------------------------------
get_Value PROC this_:DWORD, pVal:DWORD
pObjectData this_, edx
mov eax, (AsmCtrlData ptr [edx]).m_Value
mov ecx, pVal
mov [ecx], eax
xor eax, eax
ret
get_Value ENDP
;--------------------------------------------------------------------------
Raise PROC this_:DWORD, Value:DWORD
pObjectData this_, edx
mov (AsmCtrlData ptr [edx]).m_isDirty, TRUE
mov eax, (AsmCtrlData ptr [edx]).m_Value
add eax, Value
pObjectData this_, edx
mov (AsmCtrlData ptr [edx]).m_Value, eax
xor eax, eax ; return S_OK
ret
Raise ENDP
;--------------------------------------------------------------------------
put_ForeColor PROC this_:DWORD, NewColor:DWORD
pObjectData this_, ecx
mov (AsmCtrlData ptr [ecx]).m_isDirty, TRUE
mov eax, NewColor
mov (AsmCtrlData ptr [ecx]).m_ForeColor, eax
invoke SendViewChange, this_
xor eax, eax ; return S_OK
ret
put_ForeColor ENDP
;--------------------------------------------------------------------------
get_ForeColor PROC this_:DWORD, pColor:DWORD
.IF !pColor
mov eax, E_POINTER
ret
.ENDIF
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_ForeColor
mov ecx, pColor
mov [ecx], eax
xor eax, eax ; return S_OK
ret
get_ForeColor ENDP
;--------------------------------------------------------------------------
put_BackColor PROC this_:DWORD, NewColor:DWORD
pObjectData this_, ecx
mov (AsmCtrlData ptr [ecx]).m_isDirty, TRUE
mov eax, NewColor
mov (AsmCtrlData ptr [ecx]).m_BackColor, eax
invoke SendViewChange, this_
xor eax, eax ; return S_OK
ret
put_BackColor ENDP
;--------------------------------------------------------------------------
get_BackColor PROC this_:DWORD, pColor:DWORD
.IF !pColor
mov eax, E_POINTER
ret
.ENDIF
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_BackColor
mov ecx, pColor
mov [ecx], eax
xor eax, eax ; return S_OK
ret
get_BackColor ENDP
;--------------------------------------------------------------------------
AboutBox PROC this_:DWORD
LOCAL pContainer:DWORD, pOleWindow:DWORD, hwnd:DWORD, wc:WNDCLASSEX
LOCAL rect:RECT, Wwd:DWORD, Wht:DWORD, Wtx:DWORD, Wty:DWORD, hDlg:DWORD
; define the dialog box class
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET aboutBoxProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push g_hModule
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL ;OFFSET MenuName
mov wc.lpszClassName,OFFSET szAboutBox
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
mov hwnd, NULL
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_pClientSite
.IF eax
coinvoke (AsmCtrlData ptr [ecx]).m_pClientSite, IOleClientSite, GetContainer, ADDR pContainer
.IF_SUCCEEDED
coinvoke pContainer, IUnknown, QueryInterface, pIID_IOleWindow, ADDR pOleWindow
.IF_SUCCEEDED
coinvoke pOleWindow, IOleWindow, GetWindow, ADDR hwnd
coinvoke pOleWindow, IOleWindow, Release
.ENDIF
coinvoke pContainer, IOleClientSite, Release
.ENDIF
.ENDIF
invoke DialogBoxParam, g_hModule, IDD_ABOUT, hwnd, ADDR aboutBoxProc, NULL
xor eax, eax ; return S_OK
ret
AboutBox ENDP
;--------------------------------------------------------------------------
aboutBoxProc PROC hwnd:DWORD, message:DWORD, wparam:packedDW, lparam:packedDW
.IF message == WM_COMMAND
.IF wparam.loword == IDC_OK
invoke EndDialog, hwnd, 0
.ENDIF
.ELSE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -