ShellExecute和ShellExecuteEx函数主要用于执行应用程序,它们可以接收一个文件名并能自动获得同文件名相关的可执行文件名。此
外,它们还支持系统安全认证。如果在NT上设定了用户的可执行权限,ShellExecute和ShellExecuteEx函数将会在创建新的进程前检查权限CreateProcess和WinExec函数则没有这项功能)。函数调用的流程如下:
- 获得将要执行的程序名,例如test.exe。
- 根据程序名检查用户权限,如果该用户无权操作,拒绝之。
- 激活全部已注册的IshellExecuteHook扩展。
- 当所有扩展和权限都同意执行,准备创建新的进程。
- 在注册表中查询程序,查找路径为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\windows\CurrentVersion\App Paths\程序名,在该项下找程序的启动路径,如果找到,启动并返回;如果没找到,进入步骤6。
- 根据ShellExecute的设置的目录参数查找,如果存在程序,启动并返回;否则返回失败。
步骤5和6是我再查找一个程序运行错误时发现的。
原来程序之前安装过一次,后来更改启动策略,不再独立安装而采用绿色包,结果程序中用ShellExecute启动程序时不对,查找分析之后发现是调用了错误的程序,卸载之前安装的就正常了。
误打误撞,尽然发现之前对这两个函数理解太过肤浅,网上查了查,发现都没有人介绍,我这里再补充我发现的2点,告诫自己以后不到万不得已,不要使用这两个函数启动自己的应用程序。