加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi ShellExecute

发布时间:2020-12-15 09:54:31 所属栏目:大数据 来源:网络整理
导读:ShellExecute() : ? 不仅可以运行EXE文件,也可以运行系统已经关联的文件。 这个函数和WIN9X中的命令行命令"start"类似,不光可以对文件进行操作,还可以对HTTP、MAILTO等进行操作。这样我们可以设计有超级链接风格的程序了。 ShellExecute的功能要强得多,
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:taoyoyo.txt‘),SW_SHOWNORMAL);?
  就可以改变为(假设窗口的句柄为Handle)?
  ShellExecute(Handle,‘open‘,‘notepad‘,‘c:taoyoyo.txt‘,‘‘,SW_SHOWNORMAL);?
?
  此外,还可以不用那么复杂,因为.TXT的关联程序就是记事本,所以只要这样就可以了:
  ShellExecute(Handle,SW_SHOWNORMAL);?
?
  (2),例子(delphi):?
  在一个应用程序调用c:Project1.exe;?
  ShellExecute(handle,‘c:Project1.exe‘,‘字串内容‘,nil,SW_SHOWNORMAL);?
?
  在Project1.exe里可以调用:?
  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 http://bcbtop.126.com mailto: [email?protected]?
?
  并把字体改为蓝色有下划线,然后分别在两个Label的Click事件中加入以下代码:?
?
  ShellExecute(Me.hWnd,"",lbHomepage.Caption,SW_SHOWNORMAL);?
  ShellExecute(Me.hWnd,lbEMail.Caption,SW_SHOWNORMAL);?
?
  3,ShellExecute() 特殊用法?
?
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。?
?
  格式一:http://网站域名。?
  如:ShellExecute(handle,http:// ; www.neu.edu.cn‘,SW_SHOWNORMAL);?
?
  格式二:http://网站域名/网页文件名。?
  如:ShellExecute(handle,http:// ; www.neu.edu.cn/default.htm‘,SW_SHOWNORMAL);?
?
  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。?
?
  格式一:mailto:?
  如:ShellExecute(handle,‘mailto:‘,SW_SHOWNORMAL);打开新邮件窗口。?
?
  格式二:mailto:用户账号@邮件服务器地址?
  如:ShellExecute(handle,‘ mailto: [email?protected]‘,SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。?
?
  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文?
  如:ShellExecute(handle,‘ mailto: [email?protected]?subject=Hello&Body=This is a test‘,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,SW_SHOWNORMAL);
?
  用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是Microsoft Paint,Adobe Photoshop,或者 Corel PhotoPaint。
?
  有关ShellExecute的详细用法信息自己去参考有关资料吧,重要的是你知道了这个函数能打开任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute 返回打开文件的应用的实例句柄。
?
  更奇妙的是ShellExecute不仅能打开机器上的文件,还能打开Internet的站点地址。例如:
?
  ShellExecute(NULL,"http://www.microsoft.com",SW_SHOWNORMAL); ?
  这个代码使你能访问微软的主页。当ShellExecute遇到文件名前面的“http:”时,可以判断出要打开的文件是Web文件,随之启动Internet Explorer 或者 Netscape Navigator 或者任何你使用的别的浏览器打开文件。ShellExecute还能识别其它协议,象FTP、GOPHER。甚至识别“mailto”,如果文件名指向“mailto: [email?protected]”,它启动电子邮件程序并打开一个待编辑的新邮件。总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,它的用法参见有关文档。
?
  现在,你知道了ShellExecute的秘密,用它很容易增加一个链接到你的About对话框。不是吗。
?
  怎样加载其他的应用程序? ?
?
  三个SDK函数 winexec,shellexecute,createprocess可以使用。WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
  ShellExecute较 WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开 c:temp1.txt,而不用加载与 txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,我猜就是这么作的啦.
?
  ShellExecute(NULL,_T("1.txt",_T("c:temp",SW_SHOWMAXMIZED)
?
  CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:
?
  STARTUPINFO stinfo
  //启动窗口的信息
  PROCESSINFO procinfo //进程的信息
  CreateProcess(NULL,_T("notepad.exe",NULL.FALSE,
  NORMAL_PRIORITY_
  CLASS,&stinfo,&procinfo)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读