SHOW:
|
|
- or go back to the newest paste.
1 | Option Explicit | |
2 | ||
3 | Private Type SECURITY_ATTRIBUTES | |
4 | nLength As Long | |
5 | lpSecurityDescriptor As Long | |
6 | bInheritHandle As Long | |
7 | End Type | |
8 | ||
9 | Private Type PROCESS_INFORMATION | |
10 | hProcess As Long | |
11 | hThread As Long | |
12 | dwProcessId As Long | |
13 | dwThreadId As Long | |
14 | End Type | |
15 | ||
16 | Private Type STARTUPINFO | |
17 | cb As Long | |
18 | lpReserved As Long | |
19 | lpDesktop As Long | |
20 | lpTitle As Long | |
21 | dwX As Long | |
22 | dwY As Long | |
23 | dwXSize As Long | |
24 | dwYSize As Long | |
25 | dwXCountChars As Long | |
26 | dwYCountChars As Long | |
27 | dwFillAttribute As Long | |
28 | dwFlags As Long | |
29 | wShowWindow As Integer | |
30 | cbReserved2 As Integer | |
31 | lpReserved2 As Byte | |
32 | hStdInput As Long | |
33 | hStdOutput As Long | |
34 | hStdError As Long | |
35 | End Type | |
36 | ||
37 | Private Const WAIT_INFINITE As Long = (-1&) | |
38 | Private Const STARTF_USESHOWWINDOW As Long = &H1 | |
39 | Private Const STARTF_USESTDHANDLES As Long = &H100 | |
40 | Private Const SW_HIDE As Long = 0& | |
41 | ||
42 | Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long | |
43 | Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long | |
44 | Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long | |
45 | Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long | |
46 | Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long | |
47 | Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long | |
48 | Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO) | |
49 | Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long | |
50 | ||
51 | Public Function Redirect(szBinaryPath As String, szCommandLn As String) As String | |
52 | ||
53 | Dim tSA_CreatePipe As SECURITY_ATTRIBUTES | |
54 | Dim tSA_CreateProcessPrc As SECURITY_ATTRIBUTES | |
55 | Dim tSA_CreateProcessThrd As SECURITY_ATTRIBUTES | |
56 | Dim tSA_CreateProcessPrcInfo As PROCESS_INFORMATION | |
57 | Dim tStartupInfo As STARTUPINFO | |
58 | Dim hRead As Long | |
59 | Dim hWrite As Long | |
60 | Dim bRead As Long | |
61 | Dim abytBuff() As Byte | |
62 | Dim lngResult As Long | |
63 | Dim szFullCommand As String | |
64 | Dim lngExitCode As Long | |
65 | Dim lngSizeOf As Long | |
66 | ||
67 | tSA_CreatePipe.nLength = Len(tSA_CreatePipe) | |
68 | tSA_CreatePipe.lpSecurityDescriptor = 0& | |
69 | tSA_CreatePipe.bInheritHandle = True | |
70 | ||
71 | tSA_CreateProcessPrc.nLength = Len(tSA_CreateProcessPrc) | |
72 | tSA_CreateProcessThrd.nLength = Len(tSA_CreateProcessThrd) | |
73 | ||
74 | If (CreatePipe(hRead, hWrite, tSA_CreatePipe, 0&) <> 0&) Then | |
75 | tStartupInfo.cb = Len(tStartupInfo) | |
76 | GetStartupInfo tStartupInfo | |
77 | ||
78 | With tStartupInfo | |
79 | .hStdOutput = hWrite | |
80 | .hStdError = hWrite | |
81 | .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES | |
82 | .wShowWindow = SW_HIDE | |
83 | End With | |
84 | ||
85 | szFullCommand = """" & szBinaryPath & """" & " " & szCommandLn | |
86 | - | lngResult = CreateProcess(0&, szFullCommand, tSA_CreateProcessPrc, tSA_CreateProcessThrd, True, 0&, 0&, vbNullString, tStartupInfo, tSA_CreateProcessPrcInfo) |
86 | + | lngResult = CreateProcess(0&, szFullCommand, tSA_CreateProcessPrc, tSA_CreateProcessThrd, True, 0&, ByVal 0&, vbNullString, tStartupInfo, tSA_CreateProcessPrcInfo) |
87 | ||
88 | If (lngResult <> 0&) Then | |
89 | lngResult = WaitForSingleObject(tSA_CreateProcessPrcInfo.hProcess, WAIT_INFINITE) | |
90 | lngSizeOf = GetFileSize(hRead, 0&) | |
91 | If (lngSizeOf > 0) Then | |
92 | ReDim abytBuff(lngSizeOf - 1) | |
93 | If ReadFile(hRead, abytBuff(0), UBound(abytBuff) + 1, bRead, ByVal 0&) Then | |
94 | Redirect = StrConv(abytBuff, vbUnicode) | |
95 | End If | |
96 | End If | |
97 | Call GetExitCodeProcess(tSA_CreateProcessPrcInfo.hProcess, lngExitCode) | |
98 | CloseHandle tSA_CreateProcessPrcInfo.hThread | |
99 | CloseHandle tSA_CreateProcessPrcInfo.hProcess | |
100 | ||
101 | If (lngExitCode <> 0&) Then Err.Raise vbObject + 1235&, "GetExitCodeProcess", "Non-zero Application exist code" | |
102 | ||
103 | CloseHandle hWrite | |
104 | CloseHandle hRead | |
105 | Else | |
106 | Err.Raise vbObject + 1236&, "CreateProcess", "CreateProcess Failed, Code: " & Err.LastDllError | |
107 | End If | |
108 | End If | |
109 | End Function |