开发者

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

开发者 https://www.devze.com 2024-08-12 13:58 出处:网络 作者: bosins
目录方式一:直接调用Process类来实现:方式二:利用shell32.dll,调用ShellExecute方法方式三:kernel32.dll,调用WinExec方法C# 调用可执行exe文件几种方法小结1.利用进程池方式启动2.遮蔽CLI启动窗口3.异步启动方
目录
  • 方式一:直接调用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.html

    3、https://www.cnblogs.com/semth/p/10494685.html

    到此这篇关于C# 调用外部exe的三种方式的文章就介绍到这了,更多相关C# 调用外部exe内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多python多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号