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

📄 process_pipe.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include head.inc
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const
IDD_DIALOG            equ   101
IDC_EDIT                  equ 1000
IDC_SUBPROCESS     equ 1001
IDC_CONSOLE          equ 1002

.data
pipeAttr             SECURITY_ATTRIBUTES    <sizeof SECURITY_ATTRIBUTES>
startupInfo         STARTUPINFO                    <sizeof STARTUPINFO>
startupInfoCon   STARTUPINFO                    <sizeof STARTUPINFO>
pInfo                 PROCESS_INFORMATION   <0>
pInfoCon           PROCESS_INFORMATION   <0>
TitleName              db "父进程",0
NoExistError          db "子进程不能产生!",0
ExistError              db "子进程已存在!",0
SubProcessName   db "subprocess.exe",0
ConsoleName         db "Console.exe",0
.data?
hPipeRead  HANDLE  ?
hPipeWrite HANDLE  ?
buffer db 200  dup (?)

actR_W   dd  ?
ExitCode  dd  ?
.code
start:
   invoke DialogBoxParam,NULL,IDD_DIALOG,NULL,addr ModalDlgProc,NULL
   invoke ExitProcess,eax

ModalDlgProc proc uses edi hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
   local temp:dword
   .if  uMsg==WM_CLOSE
      invoke EndDialog,hWnd,NULL
   .elseif uMsg==WM_COMMAND
      mov eax,wParam
      .if lParam
         .if ax==IDC_SUBPROCESS
            mov pipeAttr.bInheritHandle,TRUE
            invoke CreatePipe,addr hPipeRead,addr hPipeWrite,addr pipeAttr,NULL  
            mov startupInfo.dwFlags,STARTF_USESTDHANDLES
            push hPipeRead
            pop startupInfo.hStdInput;子进程的输入端是管道的读道。
            invoke GetExitCodeProcess,pInfo.hProcess,addr ExitCode
            .if ExitCode!=STILL_ACTIVE
               invoke CreateProcess,NULL,addr SubProcessName,NULL,NULL,TRUE,NULL,NULL,NULL,addr startupInfo,addr pInfo
               .if  eax
                  invoke GetDlgItem,hWnd,IDC_EDIT
                  invoke GetWindowText,eax,addr buffer,200
                  invoke WriteFile,hPipeWrite,addr buffer, 200,addr actR_W,NULL
                  invoke CloseHandle,hPipeWrite
                  invoke CloseHandle,hPipeRead
               .else
                  invoke MessageBox,hWnd,addr NoExistError,addr TitleName,MB_OK
               .endif       
            .else
               invoke MessageBox,hWnd,addr ExistError,addr TitleName,MB_OK
            .endif               
         .elseif ax==IDC_CONSOLE
;            mov startupInfoCon.dwFlags,STARTF_USESTDHANDLES
            invoke GetStdHandle,STD_OUTPUT_HANDLE
            push eax            
            pop startupInfoCon.hStdOutput;  重定向。         
            invoke GetStdHandle,STD_INPUT_HANDLE
            push eax            
            pop startupInfoCon.hStdInput
            invoke CreateProcess,NULL,addr ConsoleName,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,addr startupInfoCon,addr pInfoCon; 防止子进程的句柄覆盖。
            invoke GetDlgItem,hWnd,IDC_CONSOLE
            invoke EnableWindow,eax,FALSE
        .endif
     .endif      
  .else
     mov eax,FALSE
     ret
  .endif
  mov eax,TRUE
  ret
ModalDlgProc endp
end start


⌨️ 快捷键说明

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