WIN32汇编语言教程:第13章 进程控制 · 13.2 执行可执行文件(2)
//##################################################################
#include <resource.h>
//##################################################################
#define ICO_MAIN 1000
#define DLG_MAIN 1000
#define IDC_FILE 1001
#define IDC_CMDLINE 1002
#define IDC_BROWSE 1003
//##################################################################
ICO_MAIN ICON "Main.ico"
//##################################################################
DLG_MAIN DIALOG 111, 104, 201, 57
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "执行文件"
FONT 9, "宋体"
{
LTEXT "文件名", -1, 7, 8, 25, 8
EDITTEXT IDC_FILE, 35, 5, 160, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
LTEXT "命令行", -1, 7, 25, 25, 8
EDITTEXT IDC_CMDLINE, 35, 22, 160, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
PUSHBUTTON "浏览(&B)", IDC_BROWSE, 115, 38, 40, 14
PUSHBUTTON "执行(&E)", IDOK, 155, 38, 40, 14, WS_DISABLED | WS_TABSTOP
}
//##################################################################
汇编源文件Process.asm的内容如下:
.386
.model flat, stdcall
option casemap :none
;####################################################################
; Include 文件定义
;####################################################################
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include comdlg32.inc
includelib comdlg32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN equ 1000
DLG_MAIN equ 1000
IDC_FILE equ 1001
IDC_CMDLINE equ 1002
IDC_BROWSE equ 1003
;####################################################################
; 数据段
;####################################################################
.data?
hInstance dd ?
hWinMain dd ?
szFileName db MAX_PATH dup (?)
szCmdLine db MAX_PATH dup (?)
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
.const
szFileExt db '可执行文件(*.exe;*.com)',0,'*.exe;*.com',0,0
szErrExec db '无法执行文件!',0
szStart db '执行(&E)',0
szStop db '终止(&T)',0
szBlank db ' ',0
;####################################################################
; 代码段
;####################################################################
.code
;####################################################################
_ProcExec proc uses ebx esi edi _lParam
local @szBuffer[MAX_PATH * 2]:byte
;********************************************************************
; 设置按钮状态以及其他准备工作
;********************************************************************
invoke GetDlgItem,hWinMain,IDC_FILE
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_CMDLINE
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_BROWSE
invoke EnableWindow,eax,FALSE
invoke SetDlgItemText,hWinMain,IDOK,addr szStop
invoke GetDlgItemText,hWinMain,IDC_FILE,\
addr szFileName,sizeof szFileName
invoke GetDlgItemText,hWinMain,IDC_CMDLINE,\
addr szCmdLine,sizeof szCmdLine
invoke lstrcpy,addr @szBuffer,addr szFileName
.if szCmdLine
invoke lstrcat,addr @szBuffer,addr szBlank
invoke lstrcat,addr @szBuffer,addr szCmdLine
.endif
;********************************************************************
; 创建进程
;********************************************************************
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,NULL,addr @szBuffer,NULL,NULL,NULL,\
NORMAL_PRIORITY_CLASS,NULL,NULL,\
addr stStartUp,addr stProcInfo
.if eax
;********************************************************************
; 等待进程结束
;********************************************************************
invoke WaitForSingleObject,\
stProcInfo.hProcess,INFINITE
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
.else
invoke MessageBox,hWinMain,\
addr szErrExec,NULL,MB_OK or MB_ICONWARNING
.endif
;********************************************************************
; 恢复按钮状态
;********************************************************************
invoke RtlZeroMemory,addr stProcInfo,sizeof stProcInfo
invoke GetDlgItem,hWinMain,IDC_FILE
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_CMDLINE
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_BROWSE
invoke EnableWindow,eax,TRUE
invoke SetDlgItemText,hWinMain,IDOK,addr szStart
ret
_ProcExec endp
;####################################################################
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @dwThreadID
local @stOF:OPENFILENAME
mov eax,wMsg
;********************************************************************
.if eax == WM_COMMAND
mov eax,wParam
.if ax == IDOK
;********************************************************************
.if stProcInfo.hProcess
invoke TerminateProcess,stProcInfo.hProcess,-1
.else
invoke CreateThread,NULL,0,offset _ProcExec,NULL,\
NULL,addr @dwThreadID
invoke CloseHandle,eax
.endif
;********************************************************************
.elseif ax == IDC_BROWSE
;********************************************************************
; 浏览打开的文件
;********************************************************************
上页:第13章 进程控制 · 13.2 执行可执行文件(1) 下页:第13章 进程控制 · 13.2 执行可执行文件(3)