WinExec打开exe⽂件
1,WinExec():
  WinExec主要运⾏EXE⽂件,不能运⾏其他类型的⽂件。不⽤引⽤特别单元。
  原型:UINT WinExec(exePath,ShowCmd)
  ⽰例,我想要⽤记事本打开"C:\HDC.TXT",以正常⽅式运⾏:WinExec(pChar('notepad c:\'),SW_SHOWNORMAL);
  参数说明:
  --xePath:命令⾏参数。注意,要⽤pChar转化⼀下。
  --ShowCmd:外部程序的运⾏⽅式。其取值如下:
  ----SW_HIDE 隐藏
  ----SW_MAXIMIZE 最⼤化
  ----SW_MINIMIZE 最⼩化,并把Z order顺序在此窗⼝之后(即窗⼝下⼀层)的窗⼝激活
  ----SW_RESTORE 激活窗⼝并还原为初始化⼤⼩ SW_SHOW 以当前⼤⼩和状态激活窗⼝
  ----SW_SHOW ⽤当前的⼤⼩和位置显⽰⼀个窗⼝,同时令其进⼊活动状态
  ----SW_SHOWDEFAULT 以默认⽅式运⾏
  ----SW_SHOWMAXIMIZED 激活窗⼝并最⼤化
  ----SW_SHOWMINIMIZED 激活窗⼝并最⼩化
  ----SW_SHOWMINNOACTIVE 最⼩化但不改变当前激活的窗⼝
  ----SW_SHOWNA 以当前状态显⽰窗⼝但不改变当前激活的窗⼝
  ----SW_SHOWNOACTIVATE 以初始化⼤⼩显⽰窗⼝但不改变当前激活的窗⼝
  ----SW_SHOWNORMAL 激活并显⽰窗⼝,如果是最⼤(⼩)化,窗⼝将会还原。第⼀次运⾏程序时应该使⽤这个值
  如果调⽤成功,这个函数会返回⼀个不⼩于31的值,否则调⽤失败,其返回值的意义如下:
  --0 系统内存或资源不⾜
  --ERROR_BAD_FORMAT .EXE⽂件格式⽆效(⽐如不是32位应⽤程序)
  --ERROR_FILE_NOT_FOUND 指定的⽂件设有到
  --ERROR_PATH_NOT_FOUND 指定的路径没有到
  其他:
  这个函数和system()⾮常类似,只能运⾏.EXE⽂件,这样在WINDOWS中有它不尽⼈意的地⽅,⽐如不能⽤此⽅法通过关联的⽅法打开⽂件,例如WinExec("1.html",SW_SHOWNA);就不能打开此⽂档。
  2,ShellExecute() :
  不仅可以运⾏EXE⽂件,也可以运⾏系统已经关联的⽂件。
  这个函数和WIN9X中的命令⾏命令"start"类似,不光可以对⽂件进⾏操作,还可以对HTTP、MAILTO等进⾏操作。这样我们可以设计有超级链接风格的程序了。
  ShellExecute的功能要强得多,并且可以完全替代WinExec(),事实上,WinExec()也是为了和以前版本兼容⽽保留,所以,我们要尽量使⽤ShellExecute()。
  ⾸先必须引⽤shellapi.pas单元:uses ShellAPI;
  函数原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
  参数含义如下:
  --hWnd:⽤于指定⽗窗⼝句柄。当函数调⽤过程出现错误时,它将作为Windows消息窗⼝的⽗窗⼝。例如,可以将其设置为应⽤程序主窗⼝句柄,即Application.Handle,也可以将其设置为桌⾯窗⼝句柄(⽤GetDesktopWindow函数获得)。
  --Operation:⽤于指定要进⾏的操作。
  ----open:操作表⽰执⾏由FileName参数指定的程序,或打开由FileName参数指定的⽂件或⽂件夹;
  ----print:操作表⽰打印由FileName参数指定的⽂件;
  ----explore:操作表⽰浏览由FileName参数指定的⽂件夹。
  ----为nil时,表⽰执⾏默认操作“open”。
  --FileName:⽤于指定要打开的⽂件名、要执⾏的程序⽂件名或要浏览的⽂件夹名。
  --Parameters:若FileName参数是⼀个可执⾏程序,则此参数指定命令⾏参数,否则此参数应为nil或PChar(0)。
  --Directory:⽤于指定默认⽬录。
  --ShowCmd:若FileName参数是⼀个可执⾏程序,则此参数指定程序窗⼝的初始显⽰⽅式,否则此参数应设置为0。
  ----SW_HIDE 隐藏
  ----SW_MAXIMIZE 最⼤化
  ----SW_MINIMIZE 最⼩化,并把Z order顺序在此窗⼝之后(即窗⼝下⼀层)的窗⼝激活
  ----SW_RESTORE 激活窗⼝并还原为初始化⼤⼩ SW_SHOW 以当前⼤⼩和状态激活窗⼝
  ----SW_SHOW ⽤当前的⼤⼩和位置显⽰⼀个窗⼝,同时令其进⼊活动状态
  ----SW_SHOWDEFAULT 以默认⽅式运⾏
  ----SW_SHOWMAXIMIZED 激活窗⼝并最⼤化
  ----SW_SHOWMINIMIZED 激活窗⼝并最⼩化
  ----SW_SHOWMINNOACTIVE 最⼩化但不改变当前激活的窗⼝
  ----SW_SHOWNA 以当前状态显⽰窗⼝但不改变当前激活的窗⼝
  ----SW_SHOWNOACTIVATE 以初始化⼤⼩显⽰窗⼝但不改变当前激活的窗⼝
  ----SW_SHOWNORMAL 激活并显⽰窗⼝,如果是最⼤(⼩)化,窗⼝将会还原。第⼀次运⾏程序时应该使⽤这个值
  若ShellExecute函数调⽤成功,则返回值为被执⾏程序的实例句柄。若返回值⼩于32,则表⽰出现错误。
  ⽰例:
  (1),刚才的例⼦:WinExec(pChar('notepad c:\'),SW_SHOWNORMAL);
  就可以改变为(假设窗⼝的句柄为Handle)
  ShellExecute(Handle,'open','notepad','c:\','',SW_SHOWNORMAL);
  此外,还可以不⽤那么复杂,因为.TXT的关联程序就是记事本,所以只要这样就可以了:
  ShellExecute(Handle,'','c:\','','',SW_SHOWNORMAL);
  (2),例⼦(delphi):
  在⼀个应⽤程序调⽤;
  ShellExecute(handle, 'open','','字串内容',nil, SW_SHOWNORMAL);
  在⾥可以调⽤:
  procedure TForm1.FormCreate(Sender: TObject);
  var i:integer;
  begin
  for i:=1 to paramcount do
  if ParamStr(i)〈〉'' then showmessage(ParamStr(i));
  end;
  (3),在VB中,我们⾸先声明此函数(可由VB⾃带的API游览器得到):
  Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  然后放置两个Label,设置其属性为:
  Name lbHomepage lbEMail Caption bcbtop.126 mailto:hugsnow@126
  并把字体改为蓝⾊有下划线,然后分别在两个Label的Click事件中加⼊以下代码:
  ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);
  ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);
  3,ShellExecute() 特殊⽤法
startupinfo  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若⽤户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。
  格式⼀:⽹站域名。
  如:ShellExecute(handle, 'open', ; u.edu', nil, nil, SW_SHOWNORMAL);
  格式⼆:⽹站域名/⽹页⽂件名。
  如:ShellExecute(handle, 'open', ; u.edu/default.htm',nil,nil, SW_SHOWNORMAL);
  如果将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:u.edu', nil, nil, SW_SHOWNORMAL);打开新邮件窗⼝,并⾃动填⼊收件⼈地址。若指定多个收件⼈地址,则收件⼈地址之间必须⽤分号或逗号分隔开(下同)。
  格式三:mailto:⽤户账号@邮件服务器地址?subject=邮件主题&body=邮件正⽂
  如:ShellExecute(handle, 'open', ' mailto:u.edu?subject=Hello&Body=This is a test', nil, nil, SW_SHOWNORMAL);打
开新邮件窗⼝,并⾃动填⼊收件⼈地址、邮件主题和邮件正⽂。若邮件正⽂包括多⾏⽂本,则必须在每⾏⽂本之间加⼊换⾏转义字符%0a。
  ===============
  其它⽂章:
  介绍⼀个功能强⼤的API函数 ShellExecute
  编译赵湘宁
  问题的提出:
  我使⽤MFC编写⼀个APP,要求About对话框中显⽰LOGO、公司名、地址和公司的URL链接。使⽤户点击URL链接以后,启动浏览器访问Web页⾯,这种对话框中的热链接使应⽤程序增⾊不少。我琢磨的⽅法是从系统注册表中通过查.htm 或 .html⽂件的关联程序来获得缺省浏览器的名字,这样好象有很多⼯作要做。此外,如果浏览器已经打开,总是开始⼀个新的实例替代当前已有的⼀个实例。想⼀个容易⼀点的⽅法,但我查过有关的资料,没有收获,请⾼⼿指教。
  解决⽅法:
  如果有这样的⼀个API函数该多好:OpenThisHereURLForMeNowPlease(),问题不就解决了!!我告诉你吧,有,但它不是你所想象的那个函数。到⽬前为⽌,有关⽂档中还没有提到过这么⼀个有⽤的函数,它能打开桌⾯上的任何⽂件,也能打开Internet URL。唯⼀我能到的参考资料是在Microsoft® Access KnowledgeBase中很暧昧地提到过这个函数。
  这个不可思议的函数就是:ShellExecute,取代了WinExec。你可以给它任何⽂件的名字,它都能识别出来并打开它。例如:
  ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
  ⽤缺省的位图编辑器打开⼀个叫iloveu.bmp的位图⽂件,这个缺省的位图编辑器可能是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
  有关ShellExecute的详细⽤法信息⾃⼰去参考有关资料吧,重要的是你知道了这个函数能打开任何⽂件,甚⾄是桌⾯和URL快捷⽅式(.ink或 .url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那⼀个执⾏程序,并且启动⼀个新的实例或使⽤DDE将⽂件名连到⼀打开的实例。然后,ShellExecute 返回打开⽂件的应⽤的实例句柄。
  更奇妙的是ShellExecute不仅能打开机器上的⽂件,还能打开Internet的站点地址。例如:
  ShellExecute(NULL, "open", "www.microsoft", NULL, NULL, SW_SHOWNORMAL);
  这个代码使你能访问微软的主页。当ShellExecute遇到⽂件名前⾯的“http:”时,可以判断出要打开的⽂件是Web⽂件,随之启动Internet Explorer 或者 Netscape Navigator 或者任何你使⽤的别的浏览器打开⽂件。ShellExecute还能识别其它协议,象FTP、GOPHER。甚⾄识别“mailto”,如果⽂件名指向“mailto:zxn@hqinfo”,它启动电⼦邮件程序并打开⼀个待编辑的新邮件。总之,ShellExecute函数就是如此简单地打开磁盘⽂件和Internet⽂件。如果将第⼆个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印⽂件和打开⽂件夹。ShellExecute还有⼀个扩展函数ShellExecuteEx,所带参数中有⼀个特殊的结构,功能更强,它的⽤法参见有关⽂档。
  现在,你知道了ShellExecute的秘密,⽤它很容易增加⼀个链接到你的About对话框。不是吗。
  怎样加载其他的应⽤程序?
  三个SDK函数 winexec, shellexecute,createprocess可以使⽤。WinExec最简单,两个参数,前⼀个指定路径,后⼀个指定显⽰⽅式.后⼀个参数值得说⼀下,⽐如泥⽤ SW_SHOWMAXMIZED⽅式去加载⼀个⽆最⼤化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表⾥了。
  ShellExecute较 WinExex灵活⼀点,可以指定⼯作⽬录,下⾯的Example就是直接打开 c:\,⽽不⽤加载与 txt⽂件关联的应⽤程序,很多安装程序完成后都会打开⼀个窗⼝,来显⽰Readme or Faq,我猜就是这么作的啦.
  ShellExecute(NULL,NULL,_T("1.txt",NULL,_T("c:\\temp",SW_SHOWMAXMIZED)
  CreateProcess最复杂,⼀共有⼗个参数,不过⼤部分都可以⽤NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:
  STARTUPINFO stinfo
  //启动窗⼝的信息
  PROCESSINFO procinfo //进程的信息
  CreateProcess(NULL,_T("",NULL,NULL.FALSE,
  NORMAL_PRIORITY_
  CLASS,NULL,NULL, &stinfo,&procinfo)
  --本⽂来源于[]: