我想通过COM编程,得到当前IE页面的URL 和TITLE,我该如何做?(45分)

  • 主题发起人 主题发起人 xiao dao
  • 开始时间 开始时间
X

xiao dao

Unregistered / Unconfirmed
GUEST, unregistred user!
最好有源代码。
 
function URLInfo(sBrowerPrgFile, sServiceName: string; Netscape: boolean; var Title: string): pChar;
{
参数说明:
sBrowerPrgFile: 浏览器exe文件的完整路径名
sServiceName: 浏览器的DDE-Service名字
Netscape是'Netscape',IE是'iexplore'
Title: 返回当前网页的title
返回值: pChar的字符串
}
var
DDEClientConv: TDDEClientConv;
StartPtr, EndPtr: pchar;
browserWinName: string;
begin
result:= #0;
Title:= '';

if (sBrowerPrgFile = '') or (not FileExists(sBrowerPrgFile)) then
raise EBrowserNotFoundError.create('****!浏览器应用程序不存在!');

ddeClientConv:= TDDEClientConv.Create( nil );
try
with ddeClientConv do
begin
ServiceApplication := sBrowerPrgFile;
SetLink( sServiceName,'WWW_GetWindowInfo');
StartPtr:= RequestData('0xFFFFFFFF');
end;
finally
ddeClientConv.Free;
end;

if startPtr^ = #0 then
exit;
{skip leading "}
inc(StartPtr);
EndPtr:= StartPtr;
{proceed to next "}
while (EndPtr^ <> '"') do
inc(EndPtr);
{terminate URL string}
EndPtr^:= #0;
result:= StartPtr;
{skip ","}
StartPtr:= EndPtr+3;
if Netscape then
inc(StartPtr,12);

EndPtr:= StartPtr;
if Netscape then
while (EndPtr^ <> ']') do
inc(EndPtr)
else
while (EndPtr^ <> '"') do
inc(EndPtr);

EndPtr^:= #0;
Title:= strPas(StartPtr);
end;
 
DDE也可以,最好是用COM
http://www.delphibbs.com/delphibbs/dispq.asp?lid=635843
 
想记录上网信息?我对 IObjectWithSite 接口不是非常清楚,抱歉,but,
DoBeforeNavigate2 这么可能知道 Web Title,要也是OnNavigateComplete2 呀
 
To DragonPC_???:
1、你说的是对的。DoBeforeNavigate2不可能知道Web Title,OnNavigateComplete2
一定可以知道。其实,使用OnTitleChange肯定可以得到,不过,我怎么知道某个Title对
应的URL?
2、我并不是想记录上网信息,如果这样的话有更简单的方法,大富翁论坛里就有很多
帖了。这样现成的软件也有很多吧?我只是想从技术的角度来研究一下,没想到没走两步就
遇到了绊脚石。
To public:我是初到大富翁论坛,一共问了三个问题,其中还有两个问题是重复的,没想到
还没有得到我真正想要的答案。这儿的人气很好。不过,据我几天来的观察,重复的帖子太多了。
所以我只问了问题,还没有帮大家的忙。
希望大家文问题前,先搜索一下,不要懒。一个好的地方要大家珍惜。
我仔细研究了以前的帖子,发现高手还是有的。虽然我没有得到解答,我仍对大富翁有信心。

 
To DragonPC_???:我没有看出你与我的程序有什么区别呀?(我的程序只要点击RUN菜单下的
REGISTER ACTIVEX SERVER 就可以了,已经是一个完整的程序。

我的本意就是得到URL和TITLE,不过此程序还是只能得到URL。如果我使用DoTitleChange ,
我就只能得到TITLE。我怎么知道URL和TITLE的对应关系呢?

谢谢DragonPC_??? !!我们在继续探讨吧。
 
DoBeforeNavigate2(IE,
IDispatch(dps.rgvarg^[pDispIds^[0]].dispval),
POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[2]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[3]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[4]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[5]].pvarval)^,
dps.rgvarg^[pDispIds^[6]].pbool^);
我把 IE 作为参数传递到了DoBeforeNavigate2函数里面,而函数加上该参数以后,使用
IWebBrowser2.LocationURL属性获取当前URL,好像上面是写错了 [:D]

另外 DispId = 250 这个值是什么意思?

procedure DoBeforeNavigate2(Sender: IWebBrowser2; const pDisp: IDispatch; var URL: OleVariant; var
Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var
Headers: OleVariant; var Cancel: WordBool);
begin
AssignFile(fRecord, 'c:/record.txt');
Append(fRecord);
Write(fRecord, DateTimeToStr(Now) + ' ' + Sender.LocationURL + #13#10);
CloseFile(fRecord);
end;

 
To DragonPC_??? :1、关于DispID:
…… TIE_URLRecord.SetSite函数,在此函数中,首先获得IE的Webbrowser接口,然后寻找到连接点。
并通过Advise函数建立COM自身与连接点的连接。连接成功后,如果有IE事件发生,会调用连接到自身的
IDispatch接口对象的Invoke方法。不同的事件对应不同的DispID编码,我们可以在程序中判断DispID并
做相应的处理。在上面的程序中,我们只处理了BeforeNavigate2 事件,处理函数是DoBeforeNavigate2,
把浏览地址记录到C:/record.txt中。当然,你也可以响应其他事件,对整个浏览过程做更有力的控制。不
同事件对应的DispID不同。这里,我列出了一些重要的事件对应的DispID,以便你扩充程序:
DoStatusTextChange : 102
DoDownloadComplete : 104
DoCommandStateChange : 105
DoDownloadBegin : 106
DoProgressChange : 108
DoPropertyChange : 112
DoTitleChange : 113
DoNewWindow2 : 251
DoNavigateComplete2 : 252
DoOnQuit : 253
DoOnVisible : 254
DoOnToolBar : 255
DoOnFullScreen : 258
DoDocumentComplete : 259
2、你的方法不错啊,不知你调试通过没有。如果你在DoTitleChange 中也加进IE参数,不就可以同时得到URL和TITLE吗?你的前一个帖子删掉了,希望你在贴上来,让我也用你的方法调试调试。
3、本题的分数太少了,不过因为我太忙,所以没有时间来帮大家的忙。下面我一定去挣分来补贴大家。

 
谢谢DragonPC_???, 我已经解决了,就是用你的IE参数,在TITLECHANG中拦截,
然后使用IE.localURL得到URL,用TITLECHANG原有的参数TEXT得到TITLE。
看来我碰到高手了。真心地感谢你!!!!!!!!!!!!
 
如果我要知道URL对应的TITEL,该怎么做呢?
 
you are welcome
我也感谢你,让我有机会了解了一些 IObjectWithSite 接口 [:D]
 
后退
顶部