启动外部程序

启动外部程序我们可以使用函数Winexec、ShellExecute和ShellExecuteEx。我推荐大家使用函数ShellExecute,因为它既灵活,又简单。看看下面的例子,用法就清楚了:

*: 启动一个程序

ShellExecute(Handle,"open",(LPCSTR)"d:\\模拟程序.exe",NULL,NULL,SW_SHOW);

* 启动记事本 (因为记事本在系统路径下,所以不必写完整的路径名了):

ShellExecute(Handle, "open", (LPCSTR)"notepad",NULL, NULL, SW_SHOW);

* 启动记事本并加载一个纯文本文件:

ShellExecute(Handle, "open", (LPCSTR)"notepad",(LPCSTR)"c:\\test\\readme.txt", NULL, SW_SHOW);

* 使用记事本打开一个纯文本文件 (请确定*.txt文件被关联到记事本):

ShellExecute(Handle, "open", (LPCSTR)"c:\\test\\readme.txt"),NULL, NULL, SW_SHOW);

* 使用默认浏览器打开网址:

ShellExecute(Handle, "open", (LPCSTR)"http://www.baidu.com/",NULL, NULL, SW_SHOW);

* 打印一个文件:

ShellExecute(Handle, "print", (LPCSTR)"c:/test/readme.txt",NULL, NULL, SW_SHOW);

* 用Windows Explorer打开一个文件夹:

ShellExecute(Handle, "explore", (LPCSTR)"c:/windows",NULL, NULL, SW_SHOW);

* 运行一个DOS命令并立即返回:

ShellExecute(Handle, "open", (LPCSTR)"command.com",(LPCSTR)"\\c copy file1.txt file2.txt", NULL, SW_SHOW);

* 运行一个DOS命令并保持DOS窗口打开 ("stay in DOS"):

ShellExecute(Handle, "open", (LPCSTR)"command.com",(LPCSTR)"\\k dir", NULL, SW_SHOW);

---------------------------

ShellExecute函数原型及参数含义如下:

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters,  LPCTSTR lpDirectory, INT nShowCmd);

●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。     

●lpOperation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。     

●lpFileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。     

●lpParameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。     

●lpDirectory:用于指定默认目录。     

●lpShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。

  返回值:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>

int main( void )
{
    HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "d:\\tese.log", NULL, NULL, SW_SHOW);
    if ((DWORD)hNewExe <= 32)
    {
        printf("return value:%d\n", (DWORD)hNewExe);
    }
    else
    {
        printf("successed!\n");
    }
   printf("GetLastError: %d\n", GetLastError());
    system("pause");
    return 1;
}

当“D:\\test.log”文件不存在是,执行结果如下:   这里若函数执行错误, GetLastError()不一定能捕获到错误代码,例如当“d:\\tese.log”文件存在,将记事本"notepad.exe"命名为其他名字时:

  另外两个函数的返回值就不列出了。

2、特殊用法

  1)如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。     格式一:http://网站域名。        如:ShellExecute(handle, “open”, “http://www.neu.edu.cn”, nil, nil, SW_SHOWNORMAL);     格式二:http://网站域名/网页文件名。  如:ShellExecute(handle, “open”, “http://www.neu.edu.cn/default.htm”, nil, nil, SW_SHOWNORMAL);     2)如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。     格式一:mailto:     如:ShellExecute(handle, "open", "mailto:", nil, nil, SW_SHOWNORMAL);打开新邮件窗口。     格式二:mailto:用户账号@邮件服务器地址  如:ShellExecute(handle, "open", "mailto:[email protected]", nil, nil, SW_SHOWNORMAL);   打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同) 如:ShellExecute(this->m_hWnd, "open", "mailto:[email protected]", "", "", SW_SHOW);   格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文     如:ShellExecute(handle, "open", "mailto:[email protected]?subject=Hello&Body=This is a test", nil, nil, SW_SHOWNORMAL);   打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。

时间: 2024-11-05 14:38:17

启动外部程序的相关文章

C# 启动外部程序的几种常用方法汇总

1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启动外部程序,通过事件监视其退出. 实现代码如下: // using System.Diagnostics; private string appName = "calc.exe"; /// <summary> /// 1. 启动外部程序,不等待其退出 /// </summary> private void button1_Click(object

C# 启动外部程序的几种方法

1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启动外部程序,通过事件监视其退出. // using System.Diagnostics; private string appName = "calc.exe"; /// <summary> /// 1. 启动外部程序,不等待其退出 /// </summary> private void button1_Click(object sender,

Unity启动外部程序(Process)

启动外部程序时:直接使用Process.Start();来启动外部程序,参数(需要启动的外部程序所在文件位置) 关闭外部程序时:使用 process.Kill();来关闭外部程序 private string exePath; void Start() { exePath = @"C:\Windows\System32\calc.exe"; } void OnGUI() { if (GUI.Button(new Rect(100, 100, 150, 50), "Start

C#启动外部程序(进程)

通过调用Process类可以启动系统内部(环境变量里的)或者指定位置的程序,例如: Process.Start("notepad");//启动记事本 Process.Start("iexplore", "www.baidu.com");//打开ie 百度 //打开指定目录的文件 ProcessStartInfo strInfo = new ProcessStartInfo(fileName); Process p = new Process();

奇技之VIM:win下的gvim启动外部程序如何不弹出黑屏

在windows下一般都是用的sourceinsight,到也好用,但偶而也玩玩vim.source insight执行外部命令,可以在设置中定义一个自定义键,gvim 当然也很好搞哪,冒号加!就可以了,也可以在配置vimrc中加一个快捷键,比如我加了 F11.但直接vim启动程会先弹出一个cmd窗口,里面显示这个程序的返回值什么的,有没有办法去掉了,在我的反复尝试下,发现是可以的,那就是不要直接调这个程序,而是用 start + 程序名 的方式调用. 比如我这里配置好后,F11打开explor

Qt QProcess启动和关闭外部程序

//适用于关闭后台进程的方法 QString c = "taskkill /im notepad.exe /f"; int pInt = QProcess::execute(c); //关闭后台notepad.exe进程,阻塞式运行,一直占用cpu,成功返回0,失败返回1 qDebug()<<"pInt:"<<pInt; 一.启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString &

QProcess与外部程序的调用(可以通过设置管道来交互)

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后,将随主程序的退出而退出.(2)分离式:void QProcess::startDet

Qt技巧:QProcess与外部程序的调用

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite) 外部程序启动后,将随主程序的退出而退出. (2)分离式:void QProcess::start

51CTO上的一些人

灵雨飘零 网址:http://kingrain.blog.51cto.com/ 第一次访问他的网址:.NET反编译的九大金刚  C# 启动外部程序的几种方法 风中寻觅 网址:http://xingcheng.blog.51cto.com/ 第一次访问他的网址:ASP.NET下载文件到客户端 powertoolsteam 网址:http://powertoolsteam.blog.51cto.com/ 第一次访问他的网址:Top 15 不起眼却有大作用的 .NET功能集