WinExec()是一个WIN32 API,它的第一个参数必须包含一个可执行文件名,

System()是C库函数,它接受一个DOS命令。

ShellExecute()和WinExec()区别

━━━━━━━━━━━━━━━━━━━━━━━━━━

我认为从功能上: createprocess > shellexecute > winexec 复杂程度也是!

winexec() 只用于可执行文件,是一个老函数啦,虽然使用方便,但不推荐!(兼容性也不好)

shellexcute()

是通过windows外壳打开任意文件,非可执行文件自动通过关联的程序打开

对于可执行文件,区别不大,不过shellexcute可以指定运行时的工作路径

winexec() 必须有GetMessage或超时之后才返回!CreateProcess和ShellExecute都是直接返回的!

InstallShield中的LaunchAppAndWait()

LaunchAppAndWait

语法:LaunchAppAndWait (szProgram, szCmdLine, lWait);

说明:LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行参数的应用程序。第三个参数,lWait指示安装在继续前是否要等待直到运行的应用程序终止。

一个安装程序只能监控由szProgram指定的应用程序;如果该应用程序要运行其它应用程序或进程,安装程序不能监控它们。因此,安装程序将在第一个应用程序结束后继续,即使那时由第一个应用程序运行的其它应用程序仍在运行。注意如果运行的应用程序终止失败,则安装程序将无限等待运行的应用程序完成。

参数:

szProgram

指定要被运行的应用程序的文件名。建议要指定应用程序的完整路径和文件名。如果你不包括一个路径,InstallShield将使用被Windows API 函数CreateProcess使用的相同的查找次序来定位文件。如果文件未能在这些位置找到,函数将失败。

如果应用程序的全限定名包括长文件夹名和/或一个长文件名,在把szCommand传递给LaunchAppAndWait之前先把它传递给LongPathToQuote。

szCmdLine

指定传递给运行的应用程序的命令行参数。为运行没有命令行参数的应用程序,传递一个空字符串。

lWait

指定安装程序在继续前是否要等待运行的应用程序终止。在该参数位置传递下列预定义常量之一:

NOWAIT:指定安装程序在运行应用程序后立即继续,应用程序将和安装程序脚本同时运行。注意使用该参数等效于调用函数LaunchApp。

WAIT:指定安装程序必须等待直到由该函数运行的应用程序终止。

返回值:

1:表明应用程序成功运行。

< 0:表明应用程序未能运行。

注解:

·InstallShield 安装程序使用函数CreateProcess。在InstallShield运行应用程序后,它查找装入的应用程序的窗口句柄。如果它找到窗口句柄,则它在继续前等待直到应用程序窗口消失。

·安装程序不能监控一个不创建窗口的应用程序。如果指定的应用程序没有创建一个窗口,安装程序在运行应用程序后立即继续。注意应用程序的窗口不需要可见,但它必须存在,以便让安装程序等待。

·一些应用程序试图装入DLLs并且当那些DLLs不能被定位时不能正确运行。为确保一个应用程序能找到它需要的DLLs,有必要在调用LaunchAppAndWait前改变到包含可执行应用程序的目录。为改变当前目录,调用ChangeDirectory函数。

·如果运行的应用程序终止失败,则安装程序将无限等待运行的应用程序完成。

·LaunchAppAndWait以一个全屏DOS窗口来运行DOS程序。为以一个不同类型的窗口来运行一个DOS程序,你必须直接调用Windows APIs。

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

你可以这样:

WinExec("command /C dir C:\ > dir.txt",SW_HIDE);

system("dir >dir.txt")

1: UINT WinExec ( LPCSTR lpCmdLine , // address of command line

UINT uCmdShow   // window style for new application

);

Header File : winbase.h

詳細說明請參考 Win32 SDK Reference

第一個參數是程式名及參數;第二個參數用來指定目的程式被執行起來後如何顯示。

EX1: WinExec("Notepad.exe c:\\autoexec.bat",SW_SHOW); 執行 notepad.exe 並正常顯示其程式視窗

EX2: WinExec("Notepad.exe",SW_SHOWMINIMIZED); 執行 notepad.exe 但最小化其程式視窗

EX3: WinExec("Command.com /c dir c:\\",SW_SHOW); 執行 dir C:\ ,完成後關閉 MSDOS 視窗

EX4: WinExec("Command.com /k dir c:\\",SW_SHOW); 執行 dir C:\ ,完成後不關閉 MSDOS 視窗

注意:第一個參數雖然可用長檔名,但長檔名中如果有空格的話,有時候目的程式執行起來會發生錯誤,發生錯誤的原因是目的程式本身判斷輸入參數時疏忽了長檔名的關係,如果遇到這個情況時,要記得將程式名改為短檔名喔。

2: ShellExecute(HWND hwnd, // handle to parent window

LPCTSTR lpOperation, // pointer to string that specifies operation to perform

LPCTSTR lpFile, // pointer to filename or folder name string

LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters

LPCTSTR lpDirectory, // pointer to string that specifies default directory

INT nShowCmd // whether file is shown when opened

);

Head File : ShellApi.h

詳細說明請參考 Win32 SDK Reference

==================

使用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发送到其它进程,或使用句柄来控制新进程。

函数名称: system www.2cto.com

函数原型: int system(const char *command)

函数功能: 调用DOS命令

函数返回:

参数说明:

所属文件: <stdlib.h >

#include <stdlib.h >

#include <stdio.h >

int main()

{

system( "dir ");

return 0;

}

WinExec()和system()的区别相关推荐

  1. 运行.exe文件并获取返回值(使用WinExec和system的区别)

    最近,跟同学在写一个界面,需要调用到已经release出来的.exe文件,这其中就需要传输命令行参数并获取返回值,虽然不是很复杂的一件事,但还是把找到的一些资料记录下来,也许会给遇到相同疑问的朋友带来 ...

  2. sys和system的区别

    sys和system用户区别 1 )   最重要的区别,存储的数据的重要性不同 sys: 所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的, ...

  3. Geographic coordinate system和projected coordinate system的区别(转)

    http://hi.baidu.com/moonstream/blog/item/987d9a52835be0040df3e36a.htmlGeographic 要明确两个概念:Geographic ...

  4. Java System.getProperty 和 System.getenv 区别

    Java System.getProperty 和 System.getenv 区别 getProperty and getenv方法是java.lang.System类中两个静态方法,废话少说直接看 ...

  5. qt中ShellExecute、ShellExecuteEx和WinExec的用法和区别

    今天我要介绍的是支持管理员权限的启动进程的几种方式. 分别是ShellExecute,ShellExecuteEx,WinExec. 它们的各自特点: ShellExecute:是通过windows外 ...

  6. Oracle中sys和system的区别

    1.数据库的启动需要以SYSDBA/SYSOPER身份登录. 2.如果在同一主机上使用IPC连接到数据库使用操作系统授权,登录任何一个用户都可以拥有as sysdba和as sysoper. 3.sy ...

  7. oracle system用户创建job 其他用户,oracle创建表空间、用户和表以及sys和system的区别...

    一.oracle的3个内置账号(口令管理) scott(示范账户) tiger 内置账号 system 系统管理员 操作用户 sys 超级管理员 操作数据 conn system/sasa; show ...

  8. python os system_python中os. popen system的区别

    python调用Shell脚本或者是调用系统命令,有两种方法: os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,正确会返回0,错误会返回其他数字. 后者的返回值 ...

  9. execlp和system的区别

    我们都知道,如果想在程序中调用一个别的函数可以这样进行: 1.system函数 2.execlp函数 他们两个最大的区别是: system函数会创建新的进程,而execlp不会创建新的进程.

最新文章

  1. 集锦 | 新冠图像数据分析论文集合
  2. Python中将三个列表数据zip起来并遍历(Iterating through three lists in parallel)
  3. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
  4. 【组合数学】生成函数 ( 正整数拆分 | 重复有序拆分 | 不重复有序拆分 | 重复有序拆分方案数证明 )
  5. Python自动化办公之Excel对比工具
  6. Docker操作笔记(二)容器
  7. Visual Studio 编译优化选项:Debug与Release、禁止优化与O1、O2、Ox优化
  8. 基于opencv的gpu与cpu对比程序,代码来自opencv的文档中
  9. SSL:Self-Supervised Learning(自监督学习)是什么?
  10. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许...
  11. 如何选择一个合适的大数据可视化工具
  12. asp fso的神奇功能
  13. Helen人脸数据集生成人脸分割
  14. 机械臂拉格朗日法逆动力学建模仿真(附MATLAB代码)
  15. java工作流flowable
  16. 【转载】PowerDomain简介
  17. 【java】模拟物流快递系统程序设计
  18. OpenCV学习Rosenfeld细化算法
  19. 调用高德地图API接口,实现地铁站经纬度采集
  20. 微信图片 自动上传到服务器,微信小程序怎样使图片上传至服务器

热门文章

  1. 最新 python 3 实现百度翻译 sign 逆向
  2. 安卓出现闪退是什么情况
  3. Android的触控重采样算法
  4. 联发科c语言笔试,联发科面试
  5. StratifiedKFold(分类)和Kfold(回归)的区别
  6. 哪些蓝牙耳机防水性强?防水蓝牙耳机推荐
  7. Hard Wuxing
  8. JVM——13.定位 StackOverflowError
  9. 把一个字符串分割成数组 php_PHP怎么将字符串拆分成数组
  10. 当我敲代码时,女朋友无理取闹怎么办?