Option Explicit
Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Type SECURITY_ATTRIBUTES
nLength  As Long
lpSecurityDescriptor  As Long
bInheritHandle  As Long
End Type
Private Type STARTUPINFO
cb  As Long
lpReserved  As String
lpDesktop  As String
lpTitle  As String
dwX  As Long
dwY  As Long
dwXSize  As Long
dwYSize  As Long
dwXCountChars  As Long
dwYCountChars  As Long
dwFillAttribute  As Long
dwFlags  As Long
wShowWindow  As Integer
cbReserved2  As Integer
lpReserved2  As Long
hStdInput  As Long
hStdOutput  As Long
hStdError  As Long
End Type
Private Type PROCESS_INFORMATION
hProcess  As Long
hThread  As Long
dwProcessId  As Long
dwThreadId  As Long
End Type
Private Declare Function CreateProcessAsUser Lib "advapi32.dll" Alias "CreateProcessAsUserA" (ByVal hToken As Long, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As SECURITY_ATTRIBUTES, ByVal lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As String, ByVal lpCurrentDirectory As String, ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const STARTF_USESTDHANDLES = &H100
Private Const STARTF_USESHOWWINDOW = &H1
Private Function ExecuteCommandLineOutput(CommandLine As String, Optional BufferSize As Long = 256, Optional TimeOut As Long) As String
Dim Proc    As PROCESS_INFORMATION
Dim Start    As STARTUPINFO
Dim SA    As SECURITY_ATTRIBUTES
Dim hReadPipe    As Longstartupinfo
Dim hWritePipe    As Long
Dim lBytesRead    As Long
Dim sBuffer    As String
If VBA.Len(Comm
andLine) > 0 Then
SA.nLength = Len(SA)
'sa.nLength  =  vba.Len(sa)
SA.bInheritHandle = 1&
SA.lpSecurityDescriptor = 0&
If CreatePipe(hReadPipe, hWritePipe, SA, 0) > 0 Then
Start.cb = Len(Start)
Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
Start.hStdOutput = hWritePipe
Start.hStdError = hWritePipe
If CreateProcessA(0&, CommandLine, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc) = 1 Then
CloseHandle hWritePipe
sBuffer = VBA.String(BufferSize, VBA.Chr(0))
If TimeOut > 0 Then
Dim BeginTime    As Date
BeginTime = VBA.Now
End If
Do Until ReadFile(hReadPipe, sBuffer, BufferSize, lBytesRead, 0&) = 0
DoEvents
If TimeOut < 0 Then
If DateDiff("s", BeginTime, VBA.Now) > TimeOut Then
ExecuteCommandLineOutput = "Timeout"
Exit Do
End If
End If
ExecuteCommandLineOutput = ExecuteCommandLineOutput & VBA.Trim(Replace(Left(sBuffer, lBytesRead), VBA.Chr(0), ""))
Loop
CloseHandle Proc.hProcess
CloseHandle Proc.hThread
CloseHandle hReadPipe
Else
ExecuteCommandLineOutput = "File  or  command  not  found"
End If
Else
ExecuteCommandLineOutput = "CreatePipe  failed.  Error:  " & Err.LastDllError & "."
End If
End If
End Function
ExecuteCommandLineOutput(Cmdcode,,5) 用法 返回字符串

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。