如何在ShellExecuteHook中获取可执行程序名?(200分)

  • 主题发起人 主题发起人 dodolon
  • 开始时间 开始时间
D

dodolon

Unregistered / Unconfirmed
GUEST, unregistred user!
在ShellExecuteHook的Execute方法:<br><br> &nbsp; &nbsp;function TShellExecuteHookObj.Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;<br><br>中,提供了一个ShellExecuteInfo记录描述外壳操作的信息,其中:<br><br>ShellExecuteInfo.lpVerb : &nbsp; 是要执行的动作,如open,explore,play,OpenWithUEdit32等,对应各种用户操作或程序对ShellExecute调用时的动作指定。<br>ShellExecuteInfo.lpFile : &nbsp; 是要打开的文档名或要执行的可执行程序名。<br><br>lpFile的扩展名(即文件类型)和lpVerb指明的动作决定Windows将运行的可执行程序,即使文件类型是可执行程序也一样。<br><br>相关的成员还有:lpParameters,lpDirectory,lpIDList,lpClass等,与可执行程序无关,其中通过lpIDList得到的文件总是与lpFile相同。<br><br>注册表中:<br>1、键“HKEY_CLASSES_ROOT/&lt;文件类型&gt;/shell/&lt;动作名称&gt;/command”中定义了对某种文件类型执行某种动作时使用的程序,如对.INI文件的“open”操作(双击.ini文件)在注册表中定义为键“HKEY_CLASSES_ROOT/inifile/shell/open/command”下的“默认”值:“%SystemRoot%/System32/NOTEPAD.EXE %1”。即用记事本打开。<br>2、键“HKEY_CLASSES_ROOT/*/shell/&lt;动作名称&gt;/command”中定义了对任意文件类型执行某种动作时使用的程序,这些动作名称也会出现在资源管理器的右键菜单中,如常见的“用记事本打开”、“用ACDSee查看”等。<br><br>本人编程对注册表进行操作,当某种文件类型在注册表中注册有明确的动作定义时,可正常截获可执行程序名称。当没有明确注册动作时,Windows还是可以调用相应的程序来打开相应的文件,但自己的程序却无法事先获取Windows要使用的可执行程序名。说明上面两处注册信息并不是动作定义的全部。<br><br>本人的问题是:<br>1、有没有WindowsAPI函数可根据ShellExecuteInfo提供的信息获取将要运行的可执行程序名称(Windows内部肯定有,否则它也会找不到程序)?<br>2、或是有没有固定的算法可实现问题(1)同样的功能?<br>3、再且就是注册表中哪些位置是WINDOWS外壳动作定义的全部?
 
后退
顶部