新手请求帮助(100分)

  • 主题发起人 主题发起人 newhand
  • 开始时间 开始时间
N

newhand

Unregistered / Unconfirmed
GUEST, unregistred user!
我看到如下的一篇文章,好象可以用它来实现截获网页中的超联接,可我要如何调用,
我不熟悉com,请各位帮忙给个示例。
TIEHelper = class(TComObject, IDispatch, IObjectWithSite)
public
function GetTypeInfoCount(out Count: Integer): HResult;
stdcall;
function GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
stdcall;
function Invoke(DispID: Integer;
const IID: TGUID;
LocaleID: Integer;
Flags: Word;
var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
function SetSite(const pUnkSite: IUnknown): HResult;
stdcall;
function GetSite(const riid: TIID;
out site: IUnknown): HResult;
stdcall;
private
IE: IWebbrowser2;
Cookie: Integer;
end;

在SetSite方法中处理与IE的连接:
function TIEHelper.SetSite(const pUnkSite: IUnknown): HResult;
var
cmdTarget: IOleCommandTarget;
Sp: IServiceProvider;
CPC: IConnectionPointContainer;
CP: ICOnnectionPoint;
begin
if Assigned(pUnkSite) then
begin
cmdTarget := pUnkSite as IOleCommandTarget;
Sp := CmdTarget as IServiceProvider;
if Assigned(Sp)then
Sp.QueryService(IWebbrowserApp, IWebbrowser2, IE);
if Assigned(IE) then
begin
IE.QueryInterface(IConnectionPointContainer, CPC);
CPC.FindConnectionPoint(DWEBbrowserEvents2, CP);
CP.Advise(Self, Cookie)
end;
end;
Result := S_OK;
end;
然后当IE事件引发后,会调用服务器的Invoke事件,在事件中判断DispID并执行
相应的处理:
function TIEHelper.Invoke(DispID: Integer;
const IID: TGUID;
LocaleID: Integer;
Flags: Word;
var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
type
POleVariant = ^OleVariant;
var
dps: TDispParams absolute Params;
bHasParams: boolean;
pDispIds: PDispIdList;
iDispIdsSize: integer;
begin
Result := DISP_E_MEMBERNOTFOUND;
pDispIds := nil;
iDispIdsSize := 0;
bHasParams := (dps.cArgs > 0);
if (bHasParams) then
begin
iDispIdsSize := dps.cArgs * SizeOf(TDispId);
GetMem(pDispIds, iDispIdsSize);
end;
try
if (bHasParams) then
BuildPositionalDispIds(pDispIds, dps);
case DispId of
102:
begin
do
StatusTextChange(dps.rgvarg^[pDispIds^[0]].bstrval);
Result := S_OK;
end;
108:
begin
do
ProgressChange(dps.rgvarg^[pDispIds^[0]].lval, dps.rgvarg^[pDispIds^[1]].lval);
Result := S_OK;
end;

最后,需要在注册时在注册表中添加附加信息以便IE调用:
type
TIEHelperFactory = class(TComObjectFactory)
private
procedure AddKeys;
procedure RemoveKeys;
public
procedure UpdateRegistry(Register: Boolean);
override;
end;

procedure TIEHelperFactory.AddKeys;
var S: string;
begin
S := GUIDToString(CLASS_IEHelper);
with TRegistry.Createdo
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('Software/Microsoft/Windows/CurrentVersion/explorer/Browser Helper Objects/' + S, TRUE)
then
CloseKey;
finally
free;
end;
end;

procedure TIEHelperFactory.RemoveKeys;
var S: string;
begin
S := GUIDToString(CLASS_IEHelper);
with TRegistry.Createdo
try
RootKey := HKEY_LOCAL_MACHINE;
DeleteKey('Software/Microsoft/Windows/CurrentVersion/explorer/Browser Helper Objects/' + S);
finally
free;
end;
end;

procedure TIEHelperFactory.UpdateRegistry(Register: Boolean);
begin
inherited UpdateRegistry(Register);
if Register then
AddKeys else
RemoveKeys;
end;

initialization
TIEHelperFactory.Create(ComServer, TIEHelper, Class_IEHelper,
'IEHelper', '', ciMultiInstance, tmApartment);
end.
 
各位前辈帮个忙,给点提示。
 
水平这么高了,还谦虚.我也不会.
 
谁能给初学者一点提示
 
到底有没有高手,小弟初到贵地,别让我太失望
 
这100分没有人拿吗,还是欺负新手
 
用webbrowse,在webbrowse的一些事件中调用上面的procedure或是function 不就可以了吗?
 
一定要用webbrowse吗?
 
你看看Delphi中的例子吧。
 
哪个例子,我初学,请指点,谢谢谢谢
 
其实,不是你去调用别人,而是别人去调用你,是IE去调用你的程序。
 
to CJF:
能说明如何调用吗,给个例子吧,拜托拜托!!!
 
你看看这个例子“C:/Program Files/Borland/Delphi5/Demos/Activex/Shellext”,
道理差不多的。
 
to CJF:
我看了那些例子,可是他们和我上面贴的一样,只是编译出dll的文件,
没有如何调用的示例,
如果我要实现截获网页中的超联接,我要如何调用,是不是要先注册到windows的注册表中
调用的步骤如何,能否给个简单的例子。
谢谢谢谢
 
如果你编译了上面的例子的话,当你在资源管理器中选择DPR(Project文件),在右键
菜单中就会显示一个新的功能,编译程序(如果没有记错的话),就可以直接进行Delphi
Project的编译,就是这样的过程了。可以看出其实调用Dll(ActiveX)是Windows的事
情,而不是我们去调用。
 
>>当你在资源管理器中选择DPR(Project文件),在右键
>>菜单中就会显示一个新的功能,编译程序(如果没有记错的话),
我怎么做都没有。
可能是我太愚了,实在无法理解你说的,老兄能否根据最上面的帖子,给个
实现截获网页中的超联接的例子,也许更好理解!
 
to CJF:
救人救到底!!!
 
哦,你应该再进行登记,可以使用Run菜单下的Register ActiveX Server菜单进行。
 
to CJF:
我希望能在程序中实现登记,在uninstall时卸掉。
help me,给点代码吧!!!
 
后退
顶部