usecom.asm

来自「一个用纯汇编 写的操作系统 源代码 是用 TASM 编译器写的」· 汇编 代码 · 共 143 行

ASM
143
字号

; Component Object Model usage demonstration

format PE GUI 4.0
entry start

include 'win32a.inc'

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
    \}
 }

interface ITaskBarList,\
	   QueryInterface,\
	   AddRef,\
	   Release,\
	   HrInit,\
	   AddTab,\
	   DeleteTab,\
	   ActivateTab,\
	   SetActiveAlt

CLSCTX_INPROC_SERVER	    = 0x1
CLSCTX_INPROC_HANDLER	    = 0x2
CLSCTX_LOCAL_SERVER	    = 0x4
CLSCTX_INPROC_SERVER16	    = 0x8
CLSCTX_REMOTE_SERVER	    = 0x10
CLSCTX_INPROC_HANDLER16     = 0x20
CLSCTX_INPROC_SERVERX86     = 0x40
CLSCTX_INPROC_HANDLERX86    = 0x80
CLSCTX_ESERVER_HANDLER	    = 0x100
CLSCTX_NO_CODE_DOWNLOAD     = 0x400
CLSCTX_NO_CUSTOM_MARSHAL    = 0x1000
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000
CLSCTX_NO_FAILURE_LOG	    = 0x4000
CLSCTX_DISABLE_AAA	    = 0x8000
CLSCTX_ENABLE_AAA	    = 0x10000
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000

ID_EXIT = IDCANCEL
ID_SHOW = 100
ID_HIDE = 101

IDD_COMDEMO = 1

section '.data' data readable writeable

 CLSID_TaskbarList GUID 56FDF344-FD6D-11D0-958A-006097C9A090
 IID_ITaskbarList GUID 56FDF342-FD6D-11D0-958A-006097C9A090

 ShellTaskBar ITaskBarList

section '.code' code readable executable

 start:

	invoke	CoInitialize,NULL
	invoke	CoCreateInstance,CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,ShellTaskBar

	invoke	GetModuleHandle,0
	invoke	DialogBoxParam,eax,IDD_COMDEMO,HWND_DESKTOP,COMDemo,0

	cominvk ShellTaskBar,Release

	invoke	ExitProcess,0

proc COMDemo hwnd,msg,wparam,lparam
	push	ebx esi edi
	cmp	[msg],WM_INITDIALOG
	je	wminitdialog
	cmp	[msg],WM_COMMAND
	je	wmcommand
	cmp	[msg],WM_CLOSE
	je	wmclose
	xor	eax,eax
	jmp	finish
  wminitdialog:
	jmp	processed
  wmcommand:
	cmp	[wparam],BN_CLICKED shl 16 + ID_EXIT
	je	wmclose
	cmp	[wparam],BN_CLICKED shl 16 + ID_SHOW
	je	show
	cmp	[wparam],BN_CLICKED shl 16 + ID_HIDE
	jne	processed
  hide:
	cominvk ShellTaskBar,HrInit
	cominvk ShellTaskBar,DeleteTab,[hwnd]
	jmp	processed
  show:
	mov	ebx,[ShellTaskBar]
	comcall ebx,ITaskBarList,HrInit
	comcall ebx,ITaskBarList,AddTab,[hwnd]
	comcall ebx,ITaskBarList,ActivateTab,[hwnd]
	jmp	processed
  wmclose:
	invoke	EndDialog,[hwnd],0
  processed:
	mov	eax,1
  finish:
	pop	edi esi ebx
	ret
endp

section '.idata' import data readable

  library kernel,'KERNEL32.DLL',\
	  user,'USER32.DLL',\
	  ole,'OLE32.DLL'

  import kernel,\
	 GetModuleHandle,'GetModuleHandleA',\
	 ExitProcess,'ExitProcess'

  import user,\
	 DialogBoxParam,'DialogBoxParamA',\
	 EndDialog,'EndDialog'

  import ole,\
	 CoInitialize,'CoInitialize',\
	 CoCreateInstance,'CoCreateInstance'

section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs

  resource dialogs,\
	   IDD_COMDEMO,LANG_ENGLISH+SUBLANG_DEFAULT,comdemo

  dialog comdemo,'Taskbar item control',70,70,170,24,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'BUTTON','Show',ID_SHOW,4,4,45,15,WS_VISIBLE+WS_TABSTOP
    dialogitem 'BUTTON','Hide',ID_HIDE,54,4,45,15,WS_VISIBLE+WS_TABSTOP
    dialogitem 'BUTTON','Exit',ID_EXIT,120,4,45,15,WS_VISIBLE+WS_TABSTOP
  enddialog

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?