C# 调用外部exe的三种方式
目录
- 方式一:直接调用Process类来实现:
- 方式二:利用shell32.dll,调用ShellExecute方法
- 方式三:kernel32.dll,调用WinExec方法
- C# 调用可执行exe文件几种方法小结
- 1.利用进程池方式启动
- 2.遮蔽CLI启动窗口
- 3.异步启动方式
- 参考资料:
当我们用 C# 来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站
方式一:直接调用Process类来实现:
using System.Diagnostics; Process p = Process.Start("program.exe"); p.WaitForExit();//本行代码不是必须,但是很关键,限制等待外部程序退出后才能往下执行
当exe程序需要传递参数时:
using System.Diagnostics; Process p = Process.Start("program.exe 参数"); p.WaitForExit();//本行代码不是必须,但是很关键,限制等待外部程序退出后才能往下执行
方式二:利用shell32.dlpythonl,调用ShellExecute方法
ShellExecute 方法可以打开一个已注册的文件、打开一个目录、打印一个文件等等,可以根据返回值判断是否调用成功。函数如下:
IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, ShowCommands nShowCmd);
其中,各参数信息如下:
- hwnd:指定父窗口句柄,未指定时可以为 null 或者为 0
- lpOperation:指定操作,值可以为【open】、【print】、【explore】。open:执行由 lpFile 参数指定的程序,或打开由lpFile 参数指定的文件或文件夹;print :打印由 lpFile 参数指定的文件;explore:浏览由lpFile参数指定的文件夹。当参数设为 null 时,默认为 open。
- lpFile:指定要打开的文件或程序
- lpParameters:给要打开的程序指定参数;如果打开的是文件,值为 null
- lpDirectory:默认目录
- nShowCmd:打开设置项,具体意义如下:
SW_HIDE = 0; //隐藏 SW_SHOWNORMAL = 1; //用最近的大小和位置显示, 激活 SW_NORMAL = 1; //同 SW_SHOWNORMAL SW_SHOWMINIMIZED = 2; //最小化, 激活 SW_SHOWMAXIMIZED = 3; //最大化, 激活 SW_MAXIMIZE = 3; //同 SW_SHOWMAXIMIZED SW_SHOWNOACTIVATE = 4; //用最近的大小和位置显示, 不激活 SW_SHOW = 5; //同 SW_SHOWNORMAL SW_MINIMIZE = 6; //最小化, 不激活 SW_SHOWMINNOACTIVE = 7; //同 SW_MINIMIZE SW_SHOWNA = 8; //同 SW_SHOWNOACTIVATE SW_RESTORE = 9; //同 SW_SHOWNORMAL SW_SHOWDEFAULT = 10; //同 SW_SHOWNORMAL SW_MAX = 10; //同 SW_SHOWNORMAL
返回值说明:返回值大于 32 时,即执行成功。执行失败的返回值具体意义如下:
0 = 0 //内存不足 ERROR_FILE_NOT_FOUND = 2; //文件名错误 ERROR_PATH_NOT_FOUND = 3; //路径名错误 ERROR_BAD_FORMAT = 11; //EXE 文件无效 SE_ERR_SHARE = 26; //发生共享错误 SE_ERR_ASSOCINCOMPLETE = 27; //文件名不完全或无效 SE_ERR_DDETIMEOUT = 28; //超时 SE_ERR_DDEFAIL = 29; //DDE 事务失败 SE_ERR_DDEBUSY = 30; //正在处理其他 DDE 事务而不能完成该 DDE 事务 SE_ERR_NOASSOC = 31; //没有相关联的应用程序
代码实现如下:
// 引入库 [DllImport("shell32.dll")] static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, ShowCommands nShowCmd); // 调用 string filepath = @"C:\Users\Administrator\Desktop\program.exe"; IntPtr result = ShellExecute(IntPtr.Zero, "open", filepath, "", "", ShowCommands.SW_SHOWNORMAL);
方式三:kernel32.dll,调用WinExec方法
WinExec方法仅能打开本地程序,可以根据返回值判断是否调用成功(<32表示出现错误)。
UINT WinExec(exePath,ShowCmd)
参数说明:
–xePath:命令行参数。注意,要用pChar转化一下。
–ShowCmd:外部程序的运行方式。其取值如下:----SW_HIDE 隐藏 ----SW_MAXIMIZE 最大化----SW_MINIMIZE 最小化,并把Zorder顺序在此窗口之后(即窗口下一层)的窗口激活----SW_RESTORE 激活窗口并还原为初始化大小 SW_SHOW以当前大小和状态激活窗口----SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态----SW_SHOWDEFAULT 以默认方式运行----SW_SHOWMAXIMIZED 激活窗口并最大化----SW_SHOWMINIMIZED 激活窗口并最小化----androidSW_SHOWMINNOACTIVE最小化但不改变当前激活的窗口----SW_SHOWNA 以当前状态显示窗口但不改变当前激活的窗口----SW_SHOWNOACTIVATE 以初始化大小显示窗口但不改变当前激活的窗口----SW_SHOWNORMAL 激活并显示窗口,如果是最大(小)化,窗口将会还原。第一次运行程序 时应该使用这个值
如果调用成功,这个函数会返回一个大于等于32的值,否则调用失败,其返回值的意义如下:
–0 系统内存或资源不足
–ERROR_BAD_FORMAT .EXE文件格式无效(比如不是32位应用程序)–ERROR_FILE_NOT_FOUND 指定的文件设有找到–ERROR_PATH_NOT_FOUND 指定的路径没有找到
// 引入库 [DllImport("kernel32.dll")] public static extern int WinExec(string programPath, int operType); // 调用 string pathStr=@"C:\Users\编程Administrator\Desktop\program.exe"; var result = WinExec(pathStr, (int)ShowWindowCommands.SW_SHOW);
C# 调用可执行exe文件几种方法小结
1.利用进程池方式启动
string exefile = "xxx.exe"; if (File.Exists(exefile)) { Process process = new Process(); // params 为 string 类型的参数,多个参数以空格分隔,如果某个参数为空,可以传入”” ProcessStartInfo startInfo = new ProcessStartInfo(exefile, params); process.StartInfo = startI编程客栈nfo; process.Start(); }
2.遮蔽CLI启动窗口
string exefile = "xxx.exe"; if (File.Exists(exefile)) { Process process = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo(exefile, path); startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.CreateNoWindow = true; process.StartInfo = startInfo; process.Start(); process.WaitForExit(2000); string output = process.StandardOutput.ReadToEnd(); rtb_analyze.Text = output; process.Close(); }
3.异步启动方式
public void exec(string exePath, string parameters) { Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = exePath; process.StartInfo.Arguments = parameters; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); process.BeginOutputReadLine(); process.OutputDataReceived += new DataReceivedEventHandler(processOutputDataReceived); }
参考资料:
1、https://www.jb51.net/article/81639.htm
2、https://www.cnblogs.com/daochangone/p/11364775.html3、https://www.cnblogs.com/semth/p/10494685.html到此这篇关于C# 调用外部exe的三种方式的文章就介绍到这了,更多相关C# 调用外部exe内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多python多支持编程客栈(www.devze.com)!
精彩评论