首页 > 编程语言 >C# 调用外部exe的三种方式

C# 调用外部exe的三种方式

时间:2024-06-06 16:11:14浏览次数:10  
标签:exe string C# SW ---- process 调用

C# 调用外部exe的三种方式

调用外部exe是常用的功能,本文主要介绍了C# 调用外部exe的三种方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧  方式一:直接调用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.dll,调用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 激活窗口并最小化
----SW_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 = startInfo;
    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.html
3、https://www.cnblogs.com/semth/p/10494685.html

到此这篇关于C# 调用外部exe的三种方式的文章就介绍到这了,更多相关C# 调用外部exe内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

原文链接:https://www.jb51.net/program/319280v4m.htm

标签:exe,string,C#,SW,----,process,调用
From: https://www.cnblogs.com/1175429393wljblog/p/18235469

相关文章

  • acwing 242. 一个简单的整数问题
    https://www.acwing.com/problem/content/248/给定长度为N的数列A,然后输入M行操作指令。第一类指令形如Clrd,表示把数列中第l∼r个数都加d。第二类指令形如Qx,表示询问数列中第x个数的值。对于每个询问,输出一个整数表示答案。输入格式第一行包含两个整数N......
  • clang-format说明
    ---#语言:None,Cpp,Java,JavaScript,ObjC,Proto,TableGen,TextProtoLanguage: Cpp#BasedOnStyle: LLVM#访问说明符(public、private等)的偏移AccessModifierOffset: -4#开括号(开圆括号、开尖括号、开方括号)后的对齐:Align,DontAlign,AlwaysBreak(总是在开......
  • I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞复现(XVE-2024-2115)
    0x01产品简介iDocView是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。0x02漏洞概述iDocView是一个在线文档预览系统/view/qJvqhFt.json接口处存在任意文件读取漏洞,未授权的攻击者可以利用此接口并携带默认token读取服务器敏感文件信息,使系统处于极度不安全的......
  • 通过端口复用直接进行正向tcp代理--win会被识别为病毒
    学习项目,win会被识别为病毒,关闭病毒和威胁防护,参考https://blog.csdn.net/u_say2what/article/details/134669122main.gopackagemainimport( "context" "fmt" _"golang.org/x/sys/unix" "golang.org/x/sys/windows" "io" "......
  • SD321BF 低功耗单运算放大器芯片IC
    一般说明    SD321为低功耗系统带来性能和经济性。具有高单位增益频率和保证0.4V/在此情况下,静态电流仅为430μa/aef(5V)。输入通用模式范围包括地面,因此该设备能够在单电源应用和双电源应用中工作。它还能够舒适地驱动大容量负载。    SD321可在SOT23-5封装......
  • 超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时
    >作者:尹珉,KubeSphereAmbassado,rKubeSphereContributor,KubeSphere社区用户委员会杭州站站长。踏上Containerd技术之旅容器技术已经成为现代软件开发和部署的核心工具。通过容器,开发者可以创建轻量级、便携的运行环境,从而简化应用程序的开发、测试和部署流程。在容器技术......
  • open-webui无法链接ollama 报错ERROR:apps.ollama.main:Connection error: Cannot con
    一个问题找了很久,网上没有现成的答案,我来写一个,方便再遇到的人一、问题1.ollama是使用官方curl-fsSLhttps://ollama.com/install.sh|sh 安装的2. open-webui是docker启动,docker正常启动,使用github推荐的#WebUI与ollama在同一台机器:sudodockerrun-d-p3000:8080......
  • 深入学习 CSS 中的伪元素 ::before 和 ::after
    CSS伪元素用于为元素的指定部分设置样式,作为回顾,先来看下 Mozilla 开发者网站上的解释:伪元素是一个附加至选择器末的关键词,允许你对被选择元素的特定部分修改样式。例如 ::first-line 伪元素可用于更改段落首行文字的样式。可用的CSS伪元素不是很多,但是,作为前端工程师......
  • JavaScript-变量
    JavaScript-1.变量1.js引入方式a.内部脚本:将Js代码定义在script标签中 <script>window.alert("HELLOJS")//将我们指定的入参文案以弹框的形式显示出来document.write("hellojs!")//将入参文案写入到当前的HTML内容中console.log("helloj......
  • JavaScript-数据转换
    JavaScript-数据类型转换和运算符数据类型js中的数据类型分为:原始类型和引用类型,具体有如下类型:数据类型描述number数字(整数、小数、NaN(NotaNumber))string字符串,单双引皆可boolean布尔。true,falsenull对象为空undefined当声明的变量未初始化时......