C++程序启动外部程序方法总结
C#启动和关闭外部进程的方法

C#启动和关闭外部进程的方法许多用户在程序开发过程中需要使用C#启动一个外部程序(进程),在使用完毕该外部程序后,又希望能将其关闭。
我们特在此对C#启动和关闭外部进程的方法进行一个简单的介绍。
C#启动外部程序(进程)有两种方法:一种是直接使用C#提供的Process类,利用类的函数操作来直接启动外部程序;另一种方法是使用传统的Win32 API函数CreateProcess 来实现外部进程的启动。
使用C#提供的Process类来启动外部程序方法比较简单,例举代码如下:using System.Diagnostics; // 包含了Process类的定义int myprocessID; // 进程ID// 方法一:直接使用.Net提供的Process类来实现外部程序的启动private void openButton_Click(object sender, EventArgs e){Process myProcess = Process.Start('\\NandFlash\\SerialTST.exe', ''); // 启动外部进程myprocessID = myProcess.Id; // 获得该外部进程ID}使用传统的Win32 API函数的方法相对复杂,代码如下:using System.Runtime.InteropServices; // 使用外部Win32 API#region Win32 API CreateProcess函数声明做函数申明。
[DllImport('coredll.Dll', EntryPoint = 'CreateProcess', SetLastError = true)]extern static int CreateProcess(string strImageName, string strCmdLine,IntPtr pProcessAttributes, IntPtr pThreadAttributes,int bInheritsHandle, int dwCreationFlags,IntPtr pEnvironment, IntPtr pCurrentDir,IntPtr bArray, ProcessInfo oProc);public class ProcessInfo{public int hProcess;public int hThread;public int ProcessID;public int ThreadID;}#endregion// 方法二:使用Win32 API来实现外部程序的启动private void openButton_Click(object sender, EventArgs e){ProcessInfo pi = new ProcessInfo();CreateProcess('\\NandFlash\\SerialTST.exe', '', IntPtr.Zero, IntPtr.Zero,0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, pi);myprocessID = pi.ProcessID; // 得到该程序的ID}关闭外部进程的方法就是直接通过获得的该外部进程的ID来关闭它。
c程序实验报告一 c程序的运行环境及运行方法

c程序实验报告一 c程序的运行环境及运行方法一、C程序的运行环境C程序是需要在计算机上运行的,因此它需要一个运行环境。
C语言最常见的运行环境是Windows和Unix/Linux。
1. Windows运行环境在Windows环境下,可以使用Microsoft Visual Studio或Code::Blocks等集成开发环境(IDE)来编写和运行C程序。
Visual Studio是一种比较常见且功能强大的IDE,它集成了调试器、编辑器和编译器。
在Visual Studio中,可以直接输入C代码,编辑并编译运行,也可以在命令行使用编译器gcc来编译运行C程序。
2. Unix/Linux运行环境在Unix/Linux环境下,可以使用诸如打开源软件组合(GCC)之类的编译器来编写和运行C程序。
GCC是一种功能齐全的C编译器,它在大多数Unix系统上都可用。
在Unix/Linux环境下,C程序可以在命令行上使用gcc编译并运行。
C程序的运行方法主要包括两种:使用命令行运行C程序和在IDE中运行C程序。
1. 命令行运行C程序使用GCC编译器将C代码编译为可运行二进制文件,然后在命令行上运行该二进制文件即可运行C程序。
以下是在Linux环境下的例子:(1)编写一个简单的C程序hello.c:```c#include <stdio.h>(2)使用gcc编译这个程序:$ gcc -o hello hello.c-o指定输出文件名,hello是可执行文件名。
(3)在终端上运行程序:$ ./hello输出:Hello World!2. 在IDE中运行C程序在IDE中运行C程序可以通过以下步骤完成:(1)打开IDE(例如Visual Studio)并创建一个新项目。
(2)在新项目上创建一个新的C源代码文件并输入C代码。
(3)编译代码,IDE将使用内置的编译器将C代码编译为可执行文件。
(4)运行程序,IDE将启动应用程序并附加调试器,编译器会自动转换代码并在调试器中执行。
c++中实现调用外部程序的方法linux__概述及解释说明

c++中实现调用外部程序的方法linux 概述及解释说明1. 引言1.1 概述本篇文章旨在探讨在C++语言中如何调用外部程序,并着重介绍在Linux环境下的具体方法。
调用外部程序是在软件开发中常见的需求,通过调用外部程序可以实现更多功能和交互方式。
本文将从基本原理以及注意事项开始阐述,然后详细介绍在C++中实现调用外部程序的方法,并给出示例代码进行解析。
1.2 文章结构本文将按照以下结构组织内容:首先,在引言部分进行概述和明确目的;然后在第2节中,详细讲解在C++中调用外部程序的方法,包括基本原理和Linux环境下的注意事项;紧接着,在第3节中,将通过示例及代码解析展示具体的调用外部程序的实现过程;最后,在第4节中,介绍使用第三方库实现更复杂交互方式的方法,并给出相关示例;最后一节为结论与总结。
1.3 目的本文旨在提供读者关于C++语言中如何通过调用外部程序来扩展功能和实现更灵活交互方式方面的详尽解释。
通过了解基本原理以及学习具体实践案例,读者可获得掌握在C++中调用外部程序的能力。
另外,引入第三方库实现更复杂交互方式的方法也将拓宽读者的知识面和技能应用范围。
最终,通过全面而清晰地阐述调用外部程序的方法,本文旨在提供有关调用外部程序的详尽指南,并启示读者对未来可能发展方向的展望。
以上是关于文章“1. 引言”部分内容的详细说明。
2. 调用外部程序的方法:在C++中,调用外部程序是一种常见的需求,可以通过多种方式实现。
本节将介绍C++中调用外部程序的基本原理、在Linux环境下调用外部程序时需要注意的事项以及具体的实现方法介绍。
2.1 C++中调用外部程序的基本原理:在C++中,调用外部程序可以借助操作系统提供的系统调用或库函数来实现。
常见的方法包括使用system函数、使用fork和exec函数族以及使用popen 函数等。
2.2 Linux环境下调用外部程序的注意事项:在Linux环境下调用外部程序时,需要注意以下几个方面:- 文件路径:确保正确地指定待执行的外部程序文件路径,在使用相对路径时要考虑当前工作目录。
C#如何加载程序运行目录外的程序集

C#如何加载程序运⾏⽬录外的程序集 我们的应⽤程序部署的时候,⽬录结构⼀般不会只有运⾏程序的⽬录这⼀个,我们可能在运⾏⽬录下建⼦⽬录,也可能使⽤System32⽬录,也可能使⽤其它第三⽅的程序集。
.Net程序集⾸先会在GAC中搜索相应的版本,如果未找到则会应⽤程序配置⽂件中找(如果配置),最后到应⽤程序所在的路径搜索。
如何可以将程序集部署的运⾏⽬录的⼦⽬录, 在app.config添加以下配置,其中probing的privatePath就是配置当前程序搜索的⼦⽬录<configuration>... ...<runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><probing privatePath="Plugins;Libs"/></assemblyBinding></runtime></configuration>当然我们也可以更详细的配置,不过似乎⼀般这么⽤的很少,这⾥可以指定程序集名称、公钥、⽂化,版本重定向等等信息<configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="myAssembly"publicKeyToken="32ab4ba45e0a69a1"culture="neutral"/><bindingRedirect oldVersion="1.0.0.0"newVersion="2.0.0.0"/><codeBase version="2.0.0.0"href="/myAssembly.dll"/></dependentAssembly></assemblyBinding></runtime></configuration>Msdn地址: 如何加载⾮运⾏⽬录的程序集?也许有的⼈会想到反射,的确对应单独的⼀个程序集我们可以直接调⽤使⽤ Assembly.LoadFile(@"XXX.dll");加载,再使⽤反射对其中的⽅法属性进⾏调⽤,但是如果这个程序集同时引⽤了其它的,⾮应⽤程序运⾏⽬录下的程序集,这时就会出错,这个问题该如何解决呢? 我曾尝试⽤ Assembly.LoadFile(@"XXX.dll");加载那些依赖的程序集,但是没有成功,调⽤继续出错。
C#Process调用外部程序的实现

C#Process调⽤外部程序的实现前⾔使⽤C#调⽤外部程序,⼀种是通过Process类,⼀种是通过命令⾏,本⽂主要说⼀下使⽤C#中的Process类调⽤外部程序的⽅式。
过程:1. 创建Process对象2. 配置启动选项(输⼊、输出等)3. 切换⼯作⽬录4. 设置外部程序名5. 设置传⼊参数6. 启动外部程序7. 等待外部程序结束8. 关闭外部程序过程创建Process对象Process process = new Process();//通过new创建⼀个Process对象 process//使⽤Process类需要在程序最开始处引⽤Process类所在命名空间,即下⾯这句using System.Diagnostics;配置启动选项eShellExecute = false; //必要参数process.StartInfo.RedirectStandardOutput = true;//输出参数设定process.StartInfo.RedirectStandardInput = true;//传⼊参数设定process.StartInfo.CreateNoWindow = true;切换⼯作⽬录1、⼯作⽬录:程序运⾏时其启动⽂件以及配置⽂件等⽂件的所在⽬录。
⽐如在桌⾯上选中QQ,右键单击“打开⽂件所在位置”,这个⽬录就是QQ运⾏起来后的⼯作⽬录。
我们当前编写的C#程序运⾏后也有⾃⼰的⼯作⽬录,因此如果要在C#中调⽤外部程序,最好在调⽤前将当前⼯作⽬录切换为外部程序的⼯作⽬录。
2、查看当前⼯作⽬录以下两种代码都可以打印出当前程序的⼯作⽬录System.IO.Directory.GetCurrentDirectory();该函数以sting类型返回当前⼯作⽬录,可以使⽤控制台打印当前⼯作⽬录。
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());//打印⼀下⼯作⽬录AppDomain.CurrentDomain.BaseDirectory;AppDomain:应⽤程序域,以上语句可以获取当前应⽤程序域的基⽬录,也就是应⽤程序名.exe所在⽬录,⼀般这个⽬录也是默认的⼯作⽬录。
C# 调用外部程序Process类 - Medeor - 博客园

}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Process.Start 方法,启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联。如果启动了进程资源,则为 true;如果没有启动新的进程资源(例如,如果重用了现有进程),则为 false。
上述代码在Notepad.exe记事本结束之后,弹出对话框。
方法二:Exited 事件。为外部进程添加一个事件监视器,当退出后,获取通知,这种方法时不会阻塞当前进程,你可以处理其它事情。
Code
System.Diagnostics.Process exep = new System.Diagnostics.Process();
Code
System.Diagnostics.Process exep = System.Diagnostics.Process.Start(@"C:\Windows\Notepad.exe");
exep.WaitForExit();//关键,等待外部程序退出后才能往下执行
MessageBox.Show("Notepad.exe运行完毕");
Process.StartInfo 属性,获取或设置要传递给 Process 的 Start 方法的属性。StartInfo 表示用于启动进程的一组参数。 调用 Start 时,StartInfo 用于指定要启动的进程。 唯一必须设置的 StartInfo 成员是 FileName 属性。
ProcessStartInfo.FileName 属性,获取或设置要启动的应用程序或文档。FileName 属性不需要表示可执行文件。 它可以是其扩展名已经与系统上安装的应用程序关联的任何文件类型。
VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果

VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果管道技术是一种常用的方法,用于在操作系统或者编程语言中将输出流关联到输入流。
通过使用管道,可以将一个进程的输出直接作为另一个进程的输入,从而实现进程之间的通信和数据传递。
在VC中,可以利用管道技术获取DOS或者命令行以及外部程序的执行结果。
1.执行DOS或者命令行命令要在VC中执行DOS或者命令行命令并获取执行结果,首先需要使用`popen(`函数创建一个管道,并将命令作为参数传递给该函数。
`popen(`函数返回一个文件指针,可以通过该指针读取命令的输出结果。
以下是一个示例代码:```c#include <stdio.h>int main(void)FILE *fp;char buf[1024];fp = _popen("dir", "r");if (fp == NULL)return 1;}while (fgets(buf, sizeof(buf), fp) != NULL)printf("%s", buf);}_pclose(fp);return 0;```上述代码中,使用`_popen(`函数执行`dir`命令并将其结果输出到文件指针`fp`中。
然后,通过循环读取文件指针中的内容,并打印到标准输出中。
最后,使用`_pclose(`函数关闭文件指针。
2.执行外部程序要在VC中执行外部程序并获取执行结果,也可以使用`popen(`函数。
只需将外部程序的路径和参数作为命令传递给`popen(`函数即可。
以下是一个示例代码:```c#include <stdio.h>int main(void)FILE *fp;char buf[1024];fp = _popen("C:\\Program Files\\example.exe arg1 arg2", "r");if (fp == NULL)return 1;}while (fgets(buf, sizeof(buf), fp) != NULL)printf("%s", buf);}_pclose(fp);return 0;```上述代码中,将外部程序的路径和参数作为命令传递给`_popen(`函数,跳转到该路径下并执行该程序,并将执行结果输出到文件指针`fp`中。
c语言调用外部函数

c语言调用外部函数C语言是一种广泛使用的编程语言,它可以与其他编程语言相互交互,包括调用外部函数。
调用外部函数是一种非常重要的编程技巧,它可以大大扩展C语言的功能,帮助程序员简化代码和提高工作效率。
下面将分步骤详细讲述如何在C语言中调用外部函数。
第一步:了解外部函数的概念在C语言中,外部函数是指在当前程序中未定义的函数,也称为“库函数”。
这样的函数不属于当前程序的二进制代码,而是在调用时从外部库或操作系统中加载。
常见的外部函数包括printf,scanf,malloc等。
与C函数不同,外部函数的实现不在当前程序文本之内。
第二步:包含头文件要在C程序中调用外部函数,首先需要包含相应的头文件。
头文件是指包含在C源代码中的声明,用于定义函数、变量、宏、数据类型等信息。
针对不同的外部函数,需要包含不同的头文件。
例如,想要调用数学库中的函数,需要包含头文件“math.h”。
第三步:链接库函数在进行函数调用之前,需要将库函数链接到当前程序中。
这样,链接器才能在执行文件中找到相应的函数定义,并将它们与程序的其他部分链接起来。
要链接库函数,可以使用命令行参数“-l”,后跟库名。
例如,要链接数学库,可以使用命令“-lm”。
第四步:调用外部函数调用外部函数需要使用它的函数名和参数列表。
函数名需要在头文件中声明,参数列表需要根据函数的要求设置。
例如,调用printf函数可以使用以下语句:printf("Hello World\n");其中,“printf”是函数名,“Hello World\n”是输出的字符串。
在编译C程序时,需要将外部函数的定义信息与程序中的调用代码链接起来,生成可执行文件。
一旦生成了可执行文件,就可以运行程序并调用外部函数。
总结:C语言调用外部函数是一项基本的编程技能,它可以大大扩展C 语言的功能,提高编程效率和代码的可维护性。
要调用外部函数,需要了解它们的定义、头文件和链接方式,并在程序中执行相应的调用代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总结使用WinExec命令⑴函数原型:UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);⑵参数:lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。
⑶返回值:若函数调用成功,则返回值大于31。
若函数调用失败,则返回值为下列之一:①0:系统内存或资源已耗尽。
②ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。
③ERROR_FILE_NOT_FOUND:指定的文件未找到。
④ERROR_PATH_NOT_FOUND:指定的路径未找到。
虽然Microsoft认为WinExec已过时,但是在许多时候,简单的WinExec函数仍是运行新程序的最好方式。
简单地传送作为第一个参数的命令行,还需要决定如何显示程序(该程序也许会忽视它)的第二个参数。
通常,将其设置为SW_SHOW,也可尝试SW_MINIMIZED 或SW_MAXIMIZED。
WinExec不允许用CreateProcess获得的所有选项,而它的确简单。
使用ShellExecute命令⑴函数原型:HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);⑵参数:hwnd:指向父窗口的窗口句柄。
此窗口接收应用程序产生的任何信息框。
lpOperation:一个空结束的字符串地址,此字符串指定要执行的操作。
下面的操作字符串是有效的:"open " 此函数打开由参数lpFile指定的文件,此文件可以是一个可执行文件或文档文件,也可是一个文件夹。
"print " 此函数打印由参数lpFile指定的文件,此文件应是一个文档文件,假如此文件是一个可执行文件,则打开此文件。
"explore " 此函数搜索由参数lpFile指定的文件夹,此文件应是一个文档文件,此参数可以为空。
这种情况下,函数用于打开由参数lpFile指定的文件。
lpFile:一个空结束的字符串地址,此字符串指定要打开或打印的文件或者是要打开或搜索的文件夹。
lpParameters:假如参数lpFile指定一个可执行文件,lpParameters则是一个空结束的字符串地址,此字符串指定要传递给应用程序的参数。
假如lpFile指定一个文档文件,lpParameters应为空。
lpDirectory:一个空结束的字符串地址,此字符串指定默认目录。
nShowCmd:假如lpFile指定一个可执行文件,nShowCmd表明应用程序打开时如何显示。
假如lpFile指定一个文档文件,nShowCmd应为空。
⑶返回值:若函数调用成功,则返回值大于32,否则为一个小于等于32的错误值。
说明:可以用此函数打开或搜索一个外壳文件夹。
打开文件夹可用下面任何一种形式:ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);或ShellExecute(handle, "open ", path_to_folder, NULL, NULL, SW_SHOWNORMAL);搜索文件夹,可用如下形式ShellExecute(handle, "explore ", path_to_folder, NULL, NULL, SW_SHOWNORMAL);ShellExecute命令虽已过时但易于得到。
该命令向命令解释程序提出打开、浏览或打印文档或文件夹的请求,虽然可以用ShellExecute运行程序,但通常只发送文档名,而命令解释程序则决定要运行那个程序。
另外在打开目录文件夹时,ShellExecute命令非常有用。
⑷程序示例下面通过一个例子来说名WinExec和ShellExecute的使用。
下面程序有控制台程序示例,其使用两种不同的方法,打开文本文件。
下面程序使用WinExec,并明确指定使用记事本程序。
然后,使用ShellExecute,打开文本文件。
程序清单#include <windows.h>#include <iostream.h>void main(int argc,char *argv[]){cout < <”Opening with WinExec\n”;if (WinExec(“notepad readme.txt”,SH_SHOW) <32)MessagBox(NULL,”Can’t WinExec”,NULL,MB_OK);cout < <”Press Enter\n”;MessagBox(NULL,”Press OK to continue”,”Progrm Launched”,MB_OK);cout < <”Opening with ShellExecute\n”;if (ShellExecute (NULL,”open”,”readme.txt”,NULL,NULL,SW_SHOW) <(HANDLE) 32)MessagBox(NULL,”Can’t ShellExecute\n”,NULL,MB_OK);}使用CreateProcess命令⑴函数原型:BOOL CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);⑵参数:lpApplicationName:指向一个以空结尾的串,他指定了要执行的模块lpCommandLine:指向一个以空结尾的串,该串定义了要执行的命令行。
lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。
lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。
bInheritHandles,:表明新进程是否从调用进程继承句柄。
dwCreationFlags:定义控制优先类和进程创建的附加标志。
lpEnvironment:指向一个新进程的环境块。
lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。
lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。
lpProcessInformation:指向PROCESS_INFORMATION结构,该结构接受关于新进程的表示信息。
⑶返回值:若函数调用成功,则返回值不为0;若函数调用失败,返回值为0。
ShellExecute和WinExec命令用于简单的作业。
如果要完全控制一个新进程,就必须调用CreateProcess。
在上述参数中,参数lpStartupInfo是STARTUPINFO结构。
可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入和输出。
新程序通常可以忽略多数这些数据项,如果选择那样做的话。
可以规定该结构体中的标志,已表明要设置的数据段。
有时,不想设置任何信息,也必须传递一个有效的指针给空结构(确定设置大小到cb,及设置dwFlags 成员为0)。
参数lpProcessInformation返回进程和线程句柄,还包括进程和线程ID。
这些句柄拥有在参数lpProcessAttributes和lpThreadAttributes中规定的访问。
要注意,针对CreateProcess的一些参数对控制台应用程序是特定的,而其它参数则对各种应用程序有用。
大多数情况下,并不一定要填入STARTUPINFO结构,但无论如何必须提供它。
其返回值是布尔型的,而真正感兴趣的返回值发生于作为参数传送的结构中(PROCESS_INFORMATION)。
CreateProcess返回该结构中的进程ID及其句柄,以及初始线程ID及其句柄。
可以将ID发送到其它进程,或使用句柄来控制新进程。
也可以考虑 C 函数:1 system()2 spawn() 函数系列3 exec() 函数系列c++ 启动exe(外部程序)收藏关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:【1】定义头文件必须定义以下两个头文件:#include <shlobj.h> // 可替换为 windows.h#include <shellapi.h>如果定义了头文件#include <windows.h>的话就不必定义#include<shlobj.h>了。
【2】定义路径C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:disk:\\Directory\\...\\File nameWinExec("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 ", "YourExe"等等不过这里有几点要值得注意:(1)、他不会立即返回,直到你启动的程序执行完成。