English Sentence Loading...
英语句子加载中...

VB通过创建管道来运行CMD命令

看到网上有许多朋友问如何通过VB来运行CMD命令?
也看到了一些人的回答,大部分人的问答是通过 shell来调用,也有说通过批处理的,我认为这样做不是不行,是可以的,而且处理的效率也不算太坏,但是我想那些朋友应该是这个意思:通过VB运行CMD命令后,还要把结果信息返回过来。这样就不是简单的一个shell可以做好的。shell只程序运行的线程创建出来,以后的事不管了,除非加入别的API函数来监视程序的运行。
在这里我也来推荐一下我在做这个问题时的想法,毛遂自荐吧!^&~!
我先把程序简单结构讲一下,最后把使用到的一些函数贴上来。
创建一个管道出来,
在管道里开启一个进程,
让程序在管道里运行,
等待进程结束,
后将留在管道里的程序执行信息文件读取出来。

'创建管道
Private Declare Function CreatePipe Lib "kernel32" ( _
      phReadPipe As Long, _
      phWritePipe As Long, _
      lpPipeAttributes As Any, _
      ByVal nSize As Long) As Long

'创建进程
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
     lpApplicationName As Long, ByVal lpCommandLine As String, _
     lpProcessAttributes As Any, lpThreadAttributes As Any, _
     ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
     ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
     lpStartupInfo As Any, lpProcessInformation As Any) As Long

'Shell执行函数
Private Declare Function ShellExecute Lib "shell32.dll" _
      Alias "ShellExecuteA" (ByVal hwnd As Long, _
      ByVal lpOperation As String, ByVal lpFile As String, _
      ByVal lpParameters As String, ByVal lpDirectory As String, _
      ByVal nShowCmd As Long) As Long

'等待进程结束
Private Declare Function WaitForSingleObject Lib "kernel32" _
      (ByVal hHandle As Long, ByVal dwMilliseconds 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

不过我也考虑到,通过管道来运行程序的话,程序调用的程序不在管道里结束,像一些不会能过CMD返回信息但是可以通过CMD调用的程序,如:regedit,shutdown。是等了一个单位长时间才结束。那依照这个想法做出来的程序,很长时间得不到WaitForSingleObject的响应的情况下会失去它的功能。
希望我的这点看法能够对大家有所启发,也希望这篇贴能够起到一个抛砖引玉的作用吧。
做出来一点不要忘了告诉我。
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: VB 管道 运行 CMD 命令
相关日志:
评论: 0 | 引用: 0 | 查看次数: 36508