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)

第13章 进程控制

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号