如何使命令提示符里的回显出现在VB的文本框中
(即用VB来编一个可回显能执行DOS语句的程序,谢谢各位大牛们了!)
比如:
Shell "gpupdate.exe /force"  ‘不会api刷新策略,只有用这个,高手别见笑
如何上面的gpupdate /force回显到VB中的一个文本筐里
dox中显示如下信息
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.C:\Documents and Settings\Administrator>gpupdate /force
正在刷新策略...User 策略刷新完成。
Computer 策略刷新完成。

解决方案 »

  1.   

                  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   Const   SW_HIDE   =   0   
                  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   Long   
                                  Dim   hWritePipe   As   Long   
                                  Dim   lBytesRead   As   Long   
                                  Dim   sBuffer   As   String   
                                  If   VBA.Len(CommandLine)   >   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   
                                              Start.wShowWindow   =   SW_HIDE   
                                              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   VBA.DateDiff("s",   BeginTime,   VBA.Now)   >   TimeOut   Then   
                                                                      ExecuteCommandLineOutput   =   "Timeout"   
                                                                      Exit   Do   
                                                                End   If   
                                                          End   If   
                                                          ExecuteCommandLineOutput   =   ExecuteCommandLineOutput   &   VBA.Left(sBuffer,   lBytesRead)   
                                                    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   
                  Private   Sub   Command1_Click()   '测试   
                                Text1.Text   =   ExecuteCommandLineOutput("ping   www.sina.com.cn")   
                                VBA.MsgBox   ExecuteCommandLineOutput("ping   www.xxxx.com.cn",   ,   2)   
                  End   Sub
      

  2.   

    Shell "gpupdate.exe /force > 1.TXT"  然后读这个TXT的内容进来.
      

  3.   

    如果是别的命令,也要等命令执行完成之后才能读取txt文档
      

  4.   

    1楼的测试过,但是还有一个问题
    显示百分比的时候
    DOS状态下是在同一行 直接变换百分比 比如10%直接变为20%
    在VB中则是10% 20% 50%100%
      

  5.   

    暂时也能这样了~
    万恶的“字数太短”补丁.exe