📄 process_pipe.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 + -