English Sentence Loading...
英语句子加载中...
VB通过创建管道来运行CMD命令
作者:junyuqin 日期:2007-07-31
看到网上有许多朋友问如何通过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的响应的情况下会失去它的功能。
希望我的这点看法能够对大家有所启发,也希望这篇贴能够起到一个抛砖引玉的作用吧。
做出来一点不要忘了告诉我。
也看到了一些人的回答,大部分人的问答是通过 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的响应的情况下会失去它的功能。
希望我的这点看法能够对大家有所启发,也希望这篇贴能够起到一个抛砖引玉的作用吧。
做出来一点不要忘了告诉我。
评论: 0 | 引用: 0 | 查看次数: 61518