⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 013.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 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

;********************************************************************

; 浏览打开的文件

;********************************************************************

 



    invoke  RtlZeroMemory,addr @stOF,sizeof @stOF

    mov   @stOF.lStructSize,sizeof @stOF

    push     hWinMain

    pop   @stOF.hwndOwner

    mov   @stOF.lpstrFilter,offset szFileExt

    mov   @stOF.lpstrFile,offset szFileName

    mov   @stOF.nMaxFile,MAX_PATH

    mov   @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST

    invoke  GetOpenFileName,addr @stOF

    .if   eax

      invoke  SetDlgItemText,hWnd,IDC_FILE,addr szFileName

    .endif

;********************************************************************

      .elseif ax == IDC_FILE

      invoke  GetWindowTextLength,lParam

      mov ebx,eax

      invoke  GetDlgItem,hWnd,IDOK

      invoke  EnableWindow,eax,ebx

        .endif

;********************************************************************

    .elseif eax ==  WM_CLOSE

      invoke  EndDialog,hWnd,NULL

;********************************************************************

      .elseif eax ==  WM_INITDIALOG

      push     hWnd

      pop   hWinMain

      invoke  SendDlgItemMessage,hWnd,IDC_FILE,\

      EM_LIMITTEXT,MAX_PATH,0

      invoke  SendDlgItemMessage,hWnd,IDC_CMDLINE,\

      EM_LIMITTEXT,MAX_PATH,0

;********************************************************************

      .else

      mov   eax,FALSE

      ret

    .endif

      mov eax,TRUE

      ret

 

_ProcDlgMain     endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:

        invoke  GetModuleHandle,NULL

      mov   hInstance,eax

      invoke  DialogBoxParam,eax,DLG_MAIN,NULL,\

      offset _ProcDlgMain,NULL

      invoke  ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

      end   start

当按下“浏览”按钮(IDC_BROWSE)的时候,程序在WM_COMMAND消息中显示一个“打开文件”通用对话框并让用户选择可执行文件。

当按下IDOK按钮的时候,如果有进程在执行中(hProcess不为0),表示现在按下的是“终止”按钮,这时程序调用TerminateProcess函数强制结束进程;如果没有进程在执行,表示按下的是“执行”按钮,程序创建一个新线程_ProcExec子程序,在这个子程序中完成创建新进程和等待它结束的工作。

函数CreateProcess在子进程创建以后是马上返回的,但是程序需要等待子进程结束,为了在等待的过程中主线程还能够处理对话框消息,所以程序在这里使用一个新的线程来完成创建和等待子进程的工作。

在线程函数_ProcExec中,程序灰化“文件名”输入框、“命令行”输入框和“浏览”按钮,并将文件名和命令行参数获取到缓冲区szFileName和szCmdLine中,接下来调用CreateProcess函数创建进程。

⌨️ 快捷键说明

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