📄 scriptxt.asm
字号:
.ENDIF
.IF pIASP
coinvoke pIASP, IUnknown, Release
mov pIASP, 0
.ENDIF
.IF pIAS
coinvoke pIAS, IUnknown, Release
mov pIAS, 0
.ENDIF
.IF pASSite
coinvoke pASSite, IUnknown, Release
mov pASSite, 0
.ENDIF
invoke PostQuitMessage,NULL
;-----------------------------------------------------------
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam
.IF ax==ButtonID
shr eax,16
.IF ax==BN_CLICKED
invoke RunScript
;coinvoke pScrText, IScriptText, SetText, NULL
.ENDIF
.ENDIF
.ENDIF
;-----------------------------------------------------------
.ELSEIF uMsg==WM_SIZE
movsx edx, (packedDW PTR lParam).loword
movsx ebx, (packedDW PTR lParam).hiword
.IF (edx < MinWidth) || (ebx < MinHeight)
invoke GetWindowRect, hWndApp, ADDR rc
movsx edx, (packedDW PTR lParam).loword
movsx ebx, (packedDW PTR lParam).hiword
.IF edx <= MinWidth
mov edx, rc.left
add edx, MinWidth
.ELSE
mov edx, rc.right
sub edx, rc.left
.ENDIF
.IF ebx <= MinHeight
mov ebx, rc.top
add ebx, MinHeight
mov ebx, MinHeight + ButtonHeight + ButtonHeight / 2; KLUDGE !!!!!
.ELSE
mov ebx, rc.top
sub ebx, rc.bottom
.ENDIF
invoke MoveWindow, hWndApp, rc.left, rc.top, edx, ebx, TRUE
.ELSE
sub ebx, ButtonHeight
invoke MoveWindow, hwndEdit, 0, 0, edx, ebx, FALSE
movsx edx, (packedDW PTR lParam).loword ; get the low word,Specifies the new width
mov eax, edx
sub edx, ButtonHeight
movsx ebx, (packedDW PTR lParam).hiword ; get the high word, Specifies the new height
sub ebx, ButtonHeight
invoke MoveWindow, hwndButton, 0, ebx, eax, ButtonHeight, TRUE
.ENDIF
;-----------------------------------------------------------
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
;-------------------------------------------------------------------------------
SetText PROC this_:DWORD, pNewText:DWORD
LOCAL cCount:DWORD, psBuf:DWORD
invoke SendMessage, hwndEdit, EM_SETSEL, 0, -1 ; select all text
invoke SendMessage, hwndEdit, WM_CLEAR, 0, 0 ; clear selection
invoke SysStringLen, pNewText
inc eax
mov cCount, eax
invoke HeapAlloc, hHeap, NULL, eax
mov psBuf, eax
invoke WideCharToMultiByte, CP_ACP, 0, pNewText, -1,
psBuf, cCount, NULL, NULL
invoke SendMessage, hwndEdit, WM_SETTEXT, NULL, psBuf
invoke SysFreeString, pNewText
invoke HeapFree, hHeap, NULL, psBuf
xor eax, eax ; return S_OK
ret
SetText ENDP
;-------------------------------------------------------------------------------
IActiveScriptSiteWindow_GetWindow PROC this_:DWORD, phwnd:DWORD
mov ecx, phwnd
mov eax, hWndApp
mov [ecx], eax
xor eax, eax ; return S_OK
ret
IActiveScriptSiteWindow_GetWindow ENDP
;-------------------------------------------------------------------------------
IActiveScriptSiteWindow_EnableModeless PROC this_:DWORD, fEnable:DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSiteWindow_EnableModeless ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_GetLCID PROC this_:DWORD, pLCID:DWORD
mov eax, E_NOTIMPL
ret
IActiveScriptSite_GetLCID ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_GetItemInfo PROC this_:DWORD, pstrName:DWORD, dwReturnMask:DWORD,
ppunkItem:DWORD, ppTypeInfo:DWORD
.IF (dwReturnMask & SCRIPTINFO_IUNKNOWN)
.IF !ppunkItem ; check we didn't get a non-null pointer
mov eax, E_INVALIDARG
jmp IActiveScriptSite_GetItemInfo_Done
.ENDIF
.ENDIF
.IF (dwReturnMask & SCRIPTINFO_ITYPEINFO)
.IF !ppTypeInfo ; check we didn't get a non-null pointer
mov eax, E_INVALIDARG
jmp IActiveScriptSite_GetItemInfo_Done
.ENDIF
.ENDIF
; check if we were asked for a valid object
; note we use the "W" or Unicode version of compare
invoke lstrcmpiW, pstrName, ADDR wsApplication
.IF eax ; test if pstrName == "Application"
mov eax, TYPE_E_ELEMENTNOTFOUND
jmp IActiveScriptSite_GetItemInfo_Done
.ELSE
.IF (dwReturnMask & SCRIPTINFO_IUNKNOWN)
mov ecx, ppunkItem
mov eax, pScrText
mov [ecx], eax
coinvoke pScrText, IUnknown, AddRef
jmp IActiveScriptSite_GetItemInfo_Done
.ENDIF
.IF (dwReturnMask & SCRIPTINFO_ITYPEINFO)
coinvoke pScrText, IDispatch, GetTypeInfo, 0, NULL, ppTypeInfo
jmp IActiveScriptSite_GetItemInfo_Done
.ENDIF
.ENDIF
IActiveScriptSite_GetItemInfo_Done:
ret
IActiveScriptSite_GetItemInfo ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_GetDocVersionString PROC this_:DWORD,pbstrVersionString:DWORD
mov eax, E_NOTIMPL
ret
IActiveScriptSite_GetDocVersionString ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_OnScriptTerminate PROC this_:DWORD, pvarResult:DWORD, pexcepinfo:DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSite_OnScriptTerminate ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_OnStateChange PROC this_:DWORD, ssScriptState :DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSite_OnStateChange ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_OnScriptError PROC this_:DWORD, pase:DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSite_OnScriptError ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_OnEnterScript PROC this_:DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSite_OnEnterScript ENDP
;-------------------------------------------------------------------------------
IActiveScriptSite_OnLeaveScript PROC this_:DWORD
xor eax, eax ; return S_OK
ret
IActiveScriptSite_OnLeaveScript ENDP
;-------------------------------------------------------------------------------
StartScriptEngine PROC
invoke CoInitialize, NULL
; AllocObject is from colib, it's otherwise been used as
; the DllGetClassObject Object maker method
; but it works just fine if called by itself
invoke AllocObject, ADDR pASSite, OFFSET ActiveScriptSiteClass, NULL, NULL
.IF_FAILED
jmp BadStart
.ENDIF
invoke AllocObject, ADDR pScrText, OFFSET ScriptTextClass, NULL, NULL
.IF_FAILED
jmp BadStart
.ENDIF
invoke CoCreateInstance, pCLSID_VBScript, NULL, CLSCTX_INPROC_SERVER, pIID_IActiveScript, ADDR pIAS
.IF_SUCCEEDED
coinvoke pIAS, IUnknown, QueryInterface, pIID_IActiveScriptParse, ADDR pIASP
.IF_FAILED ; bad engine start
coinvoke pIAS, IUnknown, Release,
.ENDIF
.ENDIF
xor eax, eax
ret
BadStart:
mov eax, S_FALSE
ret
StartScriptEngine ENDP
;-------------------------------------------------------------------------------
RunScript PROC
LOCAL ei:EXCEPINFO, pszScriptText:DWORD, pwszScriptText:DWORD, cChars:DWORD
LOCAL bstrScriptText:DWORD
; // Give engine your IActiveScriptSite interface...
coinvoke pASSite, IUnknown, AddRef
coinvoke pIAS, IActiveScript, SetScriptSite, pASSite
; // Give the engine a chance to initialize itself...
coinvoke pIASP, IActiveScriptParse, InitNew
; // Add a root-level item to the engine's name space...
coinvoke pIAS, IActiveScript, AddNamedItem, ADDR wsApplication, SCRIPTITEM_ISVISIBLE
; // Get the script
invoke LoadScript, ADDR pwszScriptText
; // change the scriptlet to a bstr...
invoke SysAllocString, pwszScriptText
mov bstrScriptText, eax
coinvoke pIASP, IActiveScriptParse, ParseScriptText, bstrScriptText, ADDR wsApplication, NULL, NULL, 0, 0, 0, NULL, ADDR ei
invoke SysFreeString, bstrScriptText
invoke HeapFree, hHeap, NULL, pwszScriptText
; // Set the engine state. This line actually triggers the execution of the script.
coinvoke pIAS, IActiveScript, SetScriptState, SCRIPTSTATE_CONNECTED
ret
RunScript ENDP
;-------------------------------------------------------------------------------
LoadScript PROC ppwszScriptText:DWORD
LOCAL hFile:DWORD, hMapFile:DWORD, pszScriptText:DWORD, cSize:DWORD, pEnd:DWORD
LOCAL pwszST:DWORD
invoke CreateFile,ADDR ScriptFile,
GENERIC_READ,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
mov hFile,eax
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL
mov hMapFile, eax
invoke MapViewOfFile, hMapFile, FILE_MAP_READ, 0, 0, 0
mov pszScriptText,eax
invoke GetFileSize, hFile, NULL
mov cSize, eax
add eax, pszScriptText
inc eax
mov pEnd, eax
mov [pEnd], 0
invoke SendMessage, hwndEdit, WM_SETTEXT, NULL, pszScriptText
mov eax, cSize
inc eax
rol eax, 1 ; eax <- 2* file size + 1
invoke HeapAlloc, hHeap, NULL, eax
mov pwszST, eax
invoke MultiByteToWideChar, CP_ACP, 0, pszScriptText, -1, pwszST, cSize
mov ecx, ppwszScriptText
mov eax, pwszST
mov [ecx], eax
invoke UnmapViewOfFile,pszScriptText
invoke CloseHandle, hMapFile
invoke CloseHandle, hFile
ret
LoadScript ENDP
;-------------------------------------------------------------------------------
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -