S:string;
begin
Result := S_FALSE;
with ShellExecuteInfo do
begin
FileStream:=TFileStream.Create('c:\shellexecutehook.txt',fmopenwrite);
S:=string(lpVerb)+':'+string(lpFile)+DateTimeToStr(Now)+#13#10;
FileStream.Seek(FileStream.Size,soFromBeginning);
FileStream.Write(PChar(S)^,Length(S));
FileStream.Free;
end;
end;
注册ShellExecuteHook
要想使COM对象被外壳加载,需要在注册表中注册一些信息。在下面这个子键中添加COM类的GUID及描述字符串后就可以了(描述字符串可以不赋值,但不妨给一个以便于识别)。
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
ShellExecuteHooks
{CLSID}= '描述字符串'
修改注册表可以通过重载COM的类工厂的UpdateRegistry方法来实现。代码示意如下:
implementation
uses ComServ, SysUtils;
resourcestring
sCreateRegKeyError = '创建注册表项失败';
type
TShellExComObjectFactory = class(TComObjectFactory)
public
procedure UpdateRegistry(Register: Boolean); override;
end;
{ TShellExComObjectFactory }
procedure TShellExComObjectFactory.UpdateRegistry(Register: Boolean);
const
hellExecuteHooksKey='
SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks';
var
Handle: HKey;
Status, Disposition: Integer;
ClassID: String;
begin
ClassID := GUIDToString(Class_TShellExecuteHook);
if Register then
begin
Status := RegCreateKeyEx(HKEY_LOCAL_MACHINE, PChar(
ShellExecuteHooksKey), 0, '',REG_OPTION_NON_VOLATILE,
KEY_READ or KEY_WRITE, nil, Handle, @Disposition);
if Status = 0 then
begin
Status := RegSetValueEx(Handle, PChar(ClassID), 0, REG_SZ,
PChar(Description), Length(Description) + 1);
RegCloseKey(Handle);
end;
end else
begin
Status := RegOpenKeyEx(HKEY_LOCAL_MACHINE, PChar(ShellExecuteHooksKey), 0,
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30580-3.html
加油
函数加油
我爷爷一月2300
吹吧~~~~~~也不怕牛皮吹破了~~~~~正视敌人~~~~正视敌我之间的差距~~~~~~才是强国强军之道~~~~可怕的不是敌人的强大~~~~~~而是自己的愚蠢~