📄 scriptxt.asm
字号:
;-------------------------------------------------------------------------------
; Active Script demo app
; copyright 2001 Ernest Murphy 1/8/01
;
; For educational use only. Any commercial re-use only by written license
;
;-------------------------------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
.NOLIST
;-------------------------------------------------------------------------------
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comctl32.inc
include \masm32\include\ole32.inc
include \masm32\include\oleaut32.inc
include \masm32\COM\include\oaidl.inc
include \masm32\COM\include\colib.inc
include \masm32\COM\include\L.inc
include \masm32\COM\include\ACTIVSCP.inc ; NEW colib file
include IScriptText.inc
includelib \masm32\COM\colib\colib.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ole32.lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\COMCTL32.LIB
.LISTALL
;-------------------------------------------------------------------------------
; PROTOS
StartScriptEngine proto
RunScript proto
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
ScriptDlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
LoadScript proto :DWORD
lstrcmpiW proto :DWORD,:DWORD
; as of CoLib 1.1, ClassMap is no longer required
; PUBLIC ClassMap ; thanks to Maurice MONTGENIE for pointing out this ommision
; ; (Resolves a LINK problem in that DllGetClassObject IS linked,
; ; but not called. That object needs this definition)
; ; (When colib2 is released and we can delete this again)
;-------------------------------------------------------------------------------
.data
; ClassMap DWORD NULL ; also needed with the PUBLIC up there
ClassName BYTE "SimpleWinClass",0
AppName BYTE "Scripter Test App",0
MenuName BYTE "FirstMenu",0
ButtonClassName BYTE "button",0
ButtonText BYTE "Run Script",0
ScriptFile BYTE "MyScript.vbs",0
EditClassName BYTE "edit",0
;TestString BYTE "Wow! I'm in an edit box now",0
wsApplication wchar L(<Application\0>)
pwsApplication EQU OFFSET wsApplication
ButtonHeight EQU 25
MinWidth EQU 75
MinHeight EQU 75
hwndScriptBox DWORD 0
pIAS DWORD 0 ; IActiveScript of script engine
pIASP DWORD 0 ; IActiveScriptParse of script engine
pASSite DWORD 0 ; IActiveScriptSite of this exe
pScrText DWORD 0 ; IScriptText object of this exe
InitComCtrls INITCOMMONCONTROLSEX {SIZEOF INITCOMMONCONTROLSEX, ICC_BAR_CLASSES}
; describe the interface classes inside the .exe
;-------------------------------------------------------------------------------
; ScriptText interface
ScriptTextClass ClassItem { pCLSID_ScriptText, DISPINTERFACE + SUPPLY_TYPE_INFO, \
OFFSET ScriptTextTypeLibInfo, OFFSET ScriptTextIMap, \
NULL, NULL, NULL, SIZEOF ScriptTextObject }
; describe the ScriptText object's interfaces
ScriptTextIMap InterfaceItem { pIID_IScriptText, OFFSET vtableIScriptText }
END_INTERFACE_MAP
; describe the type libraries
ScriptTextTypeLibInfo TypeLibInfo { pLIBID_ScriptText, 1, 0 }
; the ScriptText object needs no data members
ScriptTextObjData STRUCT ; ScriptText object private data struct
ScriptTextObjData ENDS
; step 2
ScriptTextObject STRUCT
ObjectData0 ObjectData { } ; base values
; ScriptTextObjData0 ScriptTextObjData { } ; custom object data does not exist
ObjectEntry0 ObjectEntry { } ; delegated Unknown
ObjectEntry1 ObjectEntry { } ; IScriptText
ScriptTextObject ENDS
; fill in the vtable
vtableIScriptText IScriptText { pvtIDispatch, SetText}
;-------------------------------------------------------------------------------
; ActiveScriptSite interface
ActiveScriptSiteClass ClassItem { NULL, NULL, \
NULL, OFFSET ActiveScriptSiteIMap, \
NULL, NULL, NULL, SIZEOF ActiveScriptSiteObject }
;DISPINTERFACE + SUPPLY_TYPE_INFO
; describe the ActiveScriptSite object's interfaces
ActiveScriptSiteIMap InterfaceItem { pIID_IActiveScriptSite, OFFSET vtableIActiveScriptSite }
InterfaceItem { pIID_IActiveScriptSiteWindow, OFFSET vtableIActiveScriptSiteWindow }
END_INTERFACE_MAP
; the ActiveScriptSite object needs no data members
ActiveScriptSiteObjData STRUCT ; ActiveScriptSite object private data struct
ActiveScriptSiteObjData ENDS
; step 2
ActiveScriptSiteObject STRUCT
ObjectData0 ObjectData { } ; base values
; ActiveScriptSiteObjData0 ActiveScriptSiteObjData { } ; custom object data does not exist
ObjectEntry0 ObjectEntry { } ; delegated Unknown
ObjectEntry1 ObjectEntry { } ; IActiveScriptSite
ObjectEntry2 ObjectEntry { } ; IActiveScriptSiteWindow
ActiveScriptSiteObject ENDS
; fill in the vtable
vtableIActiveScriptSite DWORD pvtIUnknown
DWORD IActiveScriptSite_GetLCID
DWORD IActiveScriptSite_GetItemInfo
DWORD IActiveScriptSite_GetDocVersionString
DWORD IActiveScriptSite_OnScriptTerminate
DWORD IActiveScriptSite_OnStateChange
DWORD IActiveScriptSite_OnScriptError
DWORD IActiveScriptSite_OnEnterScript
DWORD IActiveScriptSite_OnLeaveScript
vtableIActiveScriptSiteWindow DWORD pvtIUnknown
DWORD IActiveScriptSiteWindow_GetWindow
DWORD IActiveScriptSiteWindow_EnableModeless
; define the interface IID's
DeclareGuid IID_IScriptText
DeclareGuid CLSID_ScriptText
DeclareGuid LIBID_ScriptText
DeclareGuid IID_IActiveScriptSite
DeclareGuid IID_IActiveScriptSiteWindow
DeclareGuid CLSID_VBScript ; change to CLSID_JScript for Java!!!
DeclareGuid IID_IActiveScript
DeclareGuid IID_IActiveScriptParse
;-------------------------------------------------------------------------------
.data?
hWndApp DWORD ?
hInstance DWORD ?
hHeap DWORD ?
CommandLine DWORD ?
hwndButton DWORD ?
hwndEdit DWORD ?
hwndScript DWORD ?
hwndStatBar DWORD ?
buffer BYTE 512 dup(?)
SizeReadWrite DWORD ?
;-------------------------------------------------------------------------------
.const
ButtonID EQU 1
EditID EQU 2
MEMSIZE EQU 65535
APP_ICON EQU 500
abcd RASENTRYNAMEA {}
APP_ICON EQU 500
IDM_VIEWSCRIPT EQU 1001
IDM_EXIT EQU 1004
IDD_SCRIPT_BOX EQU 3000
IDC_SCRIPT EQU 3001
IDC_SCRIPT_STAT EQU 3002
IDR_SCRIPT_MENU EQU 3100
IDM_SCRIPT_NEW EQU 3101
IDM_SCRIPT_OPEN EQU 3102
IDM_SCRIPT_SAVE EQU 3103
IDM_SCRIPT_SAVEAS EQU 3104
IDM_SCRIPT_PRINT EQU 3105
IDM_SCRIPT_CLOSE EQU 3106
packedDW UNION
value DWORD ?
STRUCT
loword WORD ?
hiword WORD ?
ENDS
packedDW ENDS
;-------------------------------------------------------------------------------
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke GetProcessHeap
mov hHeap, eax
invoke InitCommonControlsEx, ADDR InitComCtrls
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
;-------------------------------------------------------------------------------
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,OFFSET MenuName
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon, hInstance, APP_ICON
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,150,150,\
600,300,NULL,NULL,\
hInst,NULL
mov hWndApp,eax
invoke ShowWindow, hWndApp,SW_SHOWNORMAL
invoke UpdateWindow, hWndApp
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
;-------------------------------------------------------------------------------
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL rc:RECT
LOCAL wplace:WINDOWPLACEMENT
;-----------------------------------------------------------
.IF uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
ES_AUTOHSCROLL or ES_MULTILINE,\
1,1,286,240,hWnd,EditID,hInstance,NULL
mov hwndEdit,eax
invoke SetFocus, hwndEdit
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
2,241,285,25,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
invoke StartScriptEngine
;-----------------------------------------------------------
.ELSEIF uMsg==WM_DESTROY
.IF pIAS
coinvoke pIAS, IActiveScript, Close
mov pIAS, 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -