_CMDSHELL proc _szCmd
LOCAL @stSecurity:SECURITY_ATTRIBUTES
LOCAL @stStartUp:STARTUPINFO
LOCAL @stProcInfo:PROCESS_INFORMATION
LOCAL @hRead1,@hRead2,@hWrite1,@hWrite2
local
@dwExitCode
local
@dwBytesRead,@dwBytesWrite
local
@stRange:CHARRANGE
invoke lstrcpy,addr szLBuf,_szCmd
invoke RtlZeroMemory,addr @stSecurity,sizeof @stSecurity
invoke RtlZeroMemory,addr @stStartUp,sizeof @stStartUp
mov @stSecurity.nLength,sizeof SECURITY_ATTRIBUTES
mov @stSecurity.lpSecurityDescriptor,NULL
mov @stSecurity.bInheritHandle,TRUE
invoke CreatePipe,addr @hRead1,addr @hWrite1,addr @stSecurity,NULL
invoke CreatePipe,addr @hRead2,addr @hWrite2,addr @stSecurity,NULL
invoke GetStartupInfo,addr @stStartUp
push @hRead1
pop @stStartUp.hStdInput
push @hWrite2
pop @stStartUp.hStdOutput
push @hWrite2
pop @stStartUp.hStdError
mov @stStartUp.dwFlags,STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW
mov @stStartUp.wShowWindow,SW_HIDE
invoke CreateProcess,NULL,addr szCmd,NULL,NULL,\
NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,addr @stStartUp,addr @stProcInfo
.
if
eax != 0
invoke WriteFile,@hWrite1,addr szLBuf,511,addr @dwBytesWrite,NULL
.
while
TRUE
;invoke GetExitCodeProcess,@stProcInfo.hProcess,addr @dwExitCode
;.
break
.
if
@dwExitCode != STILL_ACTIVE
[COLOR=
"Red"
] ;问题在下面这一句,@dwBytesRead返回的一直是0值
invoke PeekNamedPipe,@hRead2,addr szBuffer,511,addr @dwBytesRead,NULL,NULL[
/COLOR
]
.
if
@dwBytesRead != 0
invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
invoke ReadFile,@hRead2,addr szBuffer,511,addr @dwBytesRead,NULL
.
break
.
if
eax == NULL
mov @stRange.cpMin,-1
mov @stRange.cpMax,-1
invoke SendMessage,hWinText,EM_EXSETSEL,0,addr @stRange
invoke SendMessage,hWinText,EM_REPLACESEL,FALSE,addr szLBuf
invoke SendMessage,hWinText,EM_SCROLLCARET,NULL,NULL
;invoke SendMessage,hWinText,WM_SETFONqT,hFont,0
.endif
.endw
invoke CloseHandle,@stProcInfo.hProcess
invoke CloseHandle,@stProcInfo.hThread
.
else
invoke MessageBox,hWinMain,addr szExcuteError,NULL,MB_OK or MB_ICONERROR
.endif
invoke CloseHandle,@hRead1
invoke CloseHandle,@hWrite1
invoke CloseHandle,@hRead2
invoke CloseHandle,@hWrite2
ret
_CMDSHELL endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
LOCAL @szBuffer[512]:byte
LOCAL @stPos:POINT
mov eax,wMsg
.
if
eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke GetDlgItem,hWnd,IDC_EDT2
mov hWinText,eax
.elseif eax == WM_COMMAND
mov eax,wParam
.
if
ax == IDOK
invoke GetDlgItemText,hWinMain,IDC_EDT1,addr szText,sizeof szText
push ecx
invoke CreateThread,NULL,0,offset _CMDSHELL,addr szText,NULL,esp
pop ecx
invoke CloseHandle,eax
.endif
.
else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp