shellexecuteinfo?vb中shell 函数的困扰
很多朋友对于shellexecuteinfo和vb中shell 函数的困扰不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
C/C++如何在代码中获取shell命令的输出
在windows下面这个的确是需要用管道来实现的
VC6参考代码:
#include<windows.h>
#include<stdio.h>
BOOL ExcudeCmd(char*szOutPutBuf,char*szCmdLine)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength= sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor= NULL;
sa.bInheritHandle= TRUE;//输出重定向
if(!CreatePipe(&hRead,&hWrite,&sa,0))
{
printf("创建匿名管道失败");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.hStdInput=hRead;
si.hStdError= GetStdHandle(STD_ERROR_HANDLE);//把创建进程的标准错误输出重定向到管道输入
si.hStdOutput= hWrite;//把创建进程的标准输出重定向到管道输入
si.wShowWindow= SW_HIDE;
si.dwFlags=STARTF_USESTDHANDLES| STARTF_USESHOWWINDOW;
if(!CreateProcess(NULL, szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
printf("创建子进程失败");
return FALSE;
}
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
DWORD bytesRead;
if(!ReadFile(hRead,szOutPutBuf,1000,&bytesRead,NULL))
{
printf("读数据失败");
return FALSE;
}
CloseHandle(hRead);
return TRUE;
}
int main()
{
char cmdline[]="cmd.exe/c echo回显的信息",buf[1000];
ZeroMemory(buf,100);
ExcudeCmd(buf,cmdline);
printf(buf);//buf就是你想要的东西
}
Linux下面就不清楚了
如何用c++运行exe文件
【1】定义头文件
必须定义以下两个头文件:
#include<shlobj.h>//可替换为 windows.h
#include<shellapi.h>
如果定义了头文件#include<windows.h>的话就不必定义#include<shlobj.h>了。
【2】定义路径
C++中所表示的路径要用"//"而不是平常所用的"/",所以以上三个函数表示路径都为:disk://Directory//...//File name
WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL);
1、调用API: int system( const char*command);
你可以传入一命令,启动某个程序。如"ping www.vccode.com","YourExe"等等
不过这里有几点要值得注意:
(1)、他不会立即返回,直到你启动的程序执行完成。
(2)、如果你启动是windows程序,它仍然会启动一个控制台,这就给人感觉太差劲了,但如果本身是控制台的,而且又需要等待它的完成,那这将是比较好的选择。
(3)、它的返回值代表是否执行成功以及程序的退出码。
(4)、不能运行*.txt文件或"www.baidu.com"
2、调用API:
UINT WinExec(
LPCSTR lpCmdLine,// command line
UINT uCmdShow// window style
);
这个API与API:system同样的使用简单,同用是使用命令行型式。
不过它与API:system相比,有几个优点:
(1)、它将启动了一个新进程,并且立即返回,因此你的程序无需等待。
(2)、它的多了一个参数:uCmdShow,通过它你可以一定程度上控件窗体的显示,比如让它后台运行而不显示出来。
(3)、它无论启动控制台程序还是windows程序都只做你想要做的事。
vb中shell 函数的困扰
冷汗……
凭我的能力可能不能用进度条监视进度,但我能同步执行……
使用 ShellExecuteEx函数(在 SHELL32.DLL里面)。这个函数的原型如下:
Declare Function ShellExecuteEx Lib"shell32"(ByRef ShellExecInfo As SHELLEXECUTEINFO) As Long
C++语言格式(经过我的改写):
#define SEE_MASK_NOASYNC 0x100000
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize= sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask= SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd= NULL;
ShExecInfo.lpVerb= NULL;
ShExecInfo.lpFile="xxx.exe";//can be a file as well
ShExecInfo.lpParameters="";
ShExecInfo.lpDirectory= NULL;
ShExecInfo.nShow= SW_SHOW;
ShExecInfo.hInstApp= NULL;
ShellExecuteEx(&ShExecInfo);
从 C++移过来是这样的:
Const SEE_MASK_NOASYNC=&H100000
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Integer
hInstApp As Long
lpIDList As Any
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hMonitor As Long
End Type
Dim ShExecInfo As SHELLEXECUTEINFO
With ShExecInfo
.cbSize= Len(SHELLEXECUTEINFO)
.fMask= SEE_MASK_NOASYNC'fMask的取值见第二个参考网址
.hwnd= Me.hWnd
.lpVerb="OPEN"'lpVerb的取值见第二个参考网址
.lpFile="{FILENAME}";'指定文件名,可以是任意存在的文件
.lpParameters=""
.lpDirectory=""
.nShow= 1'显示出来
.hInstApp= 0
End With
ShellExecuteEx(ShExecInfo)
调用完成后进程的句柄由 hProcess返回,可使用 TerminateProcess关闭。
有关这个函数,参考网址中有很详细的说明,在此不再赘述。
调用之后这个进程就是同步的了,进程结束后才会执行之后的语句。
再回答补充的问题。VB的 VBRUN、VB、VBA库(msvbvm60.dll)里面也就 Shell函数可以打开文件了。注意一下,Shell调用的还是 WinExec函数(见 kernel32.dll):
Declare Function WinExec Lib"kernel32" Alias"WinExec"(ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long。
是不是很亲切呢?对比一下 Shell就知道了。同样返回 PID,除了参数传递不同(ByVal和 ByRef),没有不一样的,包括 nCmdShow,和 Shell的第二个参数取值都一样。
用“原装”的不行,就来“外援”:ShellExecute和 ShellExecuteEx。这两个函数其实参考网址里面已经讲得很详细了,网上也有很多用法之类的东西。
非常感谢您的阅读!我们希望本文对于解决您关于shellexecuteinfo的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。