C#?調(diào)用外部exe的三種方式
當(dāng)我們用 C# 來開發(fā)客戶端程序的時(shí)候,總會(huì)不可避免的需要調(diào)用外部程序或者訪問網(wǎng)站
方式一:直接調(diào)用Process類來實(shí)現(xiàn):
using System.Diagnostics; Process p = Process.Start("program.exe"); p.WaitForExit();//本行代碼不是必須,但是很關(guān)鍵,限制等待外部程序退出后才能往下執(zhí)行
當(dāng)exe程序需要傳遞參數(shù)時(shí):
using System.Diagnostics; Process p = Process.Start("program.exe 參數(shù)"); p.WaitForExit();//本行代碼不是必須,但是很關(guān)鍵,限制等待外部程序退出后才能往下執(zhí)行
方式二:利用shell32.dll,調(diào)用ShellExecute方法
ShellExecute 方法可以打開一個(gè)已注冊(cè)的文件、打開一個(gè)目錄、打印一個(gè)文件等等,可以根據(jù)返回值判斷是否調(diào)用成功。函數(shù)如下:
IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, ShowCommands nShowCmd);
其中,各參數(shù)信息如下:
- hwnd:指定父窗口句柄,未指定時(shí)可以為 null 或者為 0
- lpOperation:指定操作,值可以為【open】、【print】、【explore】。open:執(zhí)行由 lpFile 參數(shù)指定的程序,或打開由lpFile 參數(shù)指定的文件或文件夾;print :打印由 lpFile 參數(shù)指定的文件;explore:瀏覽由lpFile參數(shù)指定的文件夾。當(dāng)參數(shù)設(shè)為 null 時(shí),默認(rèn)為 open。
- lpFile:指定要打開的文件或程序
- lpParameters:給要打開的程序指定參數(shù);如果打開的是文件,值為 null
- lpDirectory:默認(rèn)目錄
- nShowCmd:打開設(shè)置項(xiàng),具體意義如下:
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 時(shí),即執(zhí)行成功。執(zhí)行失敗的返回值具體意義如下:
0 = 0 //內(nèi)存不足 ERROR_FILE_NOT_FOUND = 2; //文件名錯(cuò)誤 ERROR_PATH_NOT_FOUND = 3; //路徑名錯(cuò)誤 ERROR_BAD_FORMAT = 11; //EXE 文件無效 SE_ERR_SHARE = 26; //發(fā)生共享錯(cuò)誤 SE_ERR_ASSOCINCOMPLETE = 27; //文件名不完全或無效 SE_ERR_DDETIMEOUT = 28; //超時(shí) SE_ERR_DDEFAIL = 29; //DDE 事務(wù)失敗 SE_ERR_DDEBUSY = 30; //正在處理其他 DDE 事務(wù)而不能完成該 DDE 事務(wù) SE_ERR_NOASSOC = 31; //沒有相關(guān)聯(lián)的應(yīng)用程序
代碼實(shí)現(xiàn)如下:
// 引入庫 [DllImport("shell32.dll")] static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, ShowCommands nShowCmd); // 調(diào)用 string filepath = @"C:\Users\Administrator\Desktop\program.exe"; IntPtr result = ShellExecute(IntPtr.Zero, "open", filepath, "", "", ShowCommands.SW_SHOWNORMAL);
方式三:kernel32.dll,調(diào)用WinExec方法
WinExec方法僅能打開本地程序,可以根據(jù)返回值判斷是否調(diào)用成功(<32表示出現(xiàn)錯(cuò)誤)。
UINT WinExec(exePath,ShowCmd)
參數(shù)說明:
–xePath:命令行參數(shù)。注意,要用pChar轉(zhuǎn)化一下。
–ShowCmd:外部程序的運(yùn)行方式。其取值如下:
----SW_HIDE 隱藏
----SW_MAXIMIZE 最大化
----SW_MINIMIZE 最小化,并把Zorder順序在此窗口之后(即窗口下一層)的窗口激活
----SW_RESTORE 激活窗口并還原為初始化大小 SW_SHOW以當(dāng)前大小和狀態(tài)激活窗口
----SW_SHOW 用當(dāng)前的大小和位置顯示一個(gè)窗口,同時(shí)令其進(jìn)入活動(dòng)狀態(tài)
----SW_SHOWDEFAULT 以默認(rèn)方式運(yùn)行
----SW_SHOWMAXIMIZED 激活窗口并最大化
----SW_SHOWMINIMIZED 激活窗口并最小化
----SW_SHOWMINNOACTIVE最小化但不改變當(dāng)前激活的窗口
----SW_SHOWNA 以當(dāng)前狀態(tài)顯示窗口但不改變當(dāng)前激活的窗口
----SW_SHOWNOACTIVATE 以初始化大小顯示窗口但不改變當(dāng)前激活的窗口
----SW_SHOWNORMAL 激活并顯示窗口,如果是最大(小)化,窗口將會(huì)還原。第一次運(yùn)行程序 時(shí)應(yīng)該使用這個(gè)值
如果調(diào)用成功,這個(gè)函數(shù)會(huì)返回一個(gè)大于等于32的值,否則調(diào)用失敗,其返回值的意義如下:
–0 系統(tǒng)內(nèi)存或資源不足
–ERROR_BAD_FORMAT .EXE文件格式無效(比如不是32位應(yīng)用程序)
–ERROR_FILE_NOT_FOUND 指定的文件設(shè)有找到
–ERROR_PATH_NOT_FOUND 指定的路徑?jīng)]有找到
// 引入庫 [DllImport("kernel32.dll")] public static extern int WinExec(string programPath, int operType); // 調(diào)用 string pathStr=@"C:\Users\Administrator\Desktop\program.exe"; var result = WinExec(pathStr, (int)ShowWindowCommands.SW_SHOW);
C# 調(diào)用可執(zhí)行exe文件幾種方法小結(jié)
1.利用進(jìn)程池方式啟動(dòng)
string exefile = "xxx.exe"; if (File.Exists(exefile)) { Process process = new Process(); // params 為 string 類型的參數(shù),多個(gè)參數(shù)以空格分隔,如果某個(gè)參數(shù)為空,可以傳入”” ProcessStartInfo startInfo = new ProcessStartInfo(exefile, params); process.StartInfo = startInfo; process.Start(); }
2.遮蔽CLI啟動(dòng)窗口
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.異步啟動(dòng)方式
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、http://chabaoo.cn/article/81639.htm
2、https://www.cnblogs.com/daochangone/p/11364775.html
3、https://www.cnblogs.com/semth/p/10494685.html
到此這篇關(guān)于C# 調(diào)用外部exe的三種方式的文章就介紹到這了,更多相關(guān)C# 調(diào)用外部exe內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用GetInvalidFileNameCharts生成文件名
這篇文章主要介紹了一個(gè)很實(shí)用的函數(shù)Path.GetInvalidFileNameCharts(),他可以很方便的生成一個(gè)有效的文件名稱2014-01-01C#使用StopWatch獲取程序毫秒級(jí)執(zhí)行時(shí)間的方法
這篇文章主要介紹了C#使用StopWatch獲取程序毫秒級(jí)執(zhí)行時(shí)間的方法,涉及C#操作時(shí)間的相關(guān)技巧,需要的朋友可以參考下2015-04-04WinForm自定義函數(shù)FindControl實(shí)現(xiàn)按名稱查找控件
這篇文章主要介紹了WinForm自定義函數(shù)FindControl實(shí)現(xiàn)按名稱查找控件,需要的朋友可以參考下2014-08-08C#如何讀取Txt大數(shù)據(jù)并更新到數(shù)據(jù)庫詳解
這篇文章主要給大家介紹了關(guān)于C#如何讀取Txt大數(shù)據(jù)并更新到數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決
今天在做個(gè)東西,發(fā)現(xiàn)報(bào)錯(cuò),特此來記錄一下,本文介紹了Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決,感興趣的可以了解一下2021-05-05