200分求IE右键菜单启动程序的关键细节!(200分)

  • 主题发起人 主题发起人 shdxx
  • 开始时间 开始时间
S

shdxx

Unregistered / Unconfirmed
GUEST, unregistred user!
网络蚂蚁,网际快车的IE右键菜单调用大致是这样实现的:在注册表中添加一个IE的右键菜单项,使它指向一段用VBScript或JavaScript编写的代码,点击IE右键时执行这段代码,然后调用已注册的Activedll中的方法来获得IE的元素,比如文本链接之类,这个dll启动主程序,并把元素传递给主程序。
我的问题是:上面的这个实现流程有不对的地方吗?如果正确,我想问的是:这个ActiveDll编写过程中调用主程序以及把网页的元素传递给主程序的代码如何写?请给段实例代码;
其他功能我已经实现:IE的右键菜单,JavaScript代码以及调用ActiveDll也已经实现,唯一没有实现的是ActiveDll如何调用主程序及如何传递信息;我曾经尝试把主程序做成自动化服务器,这样可以实现启动,但是调用完成主程序自动退出,不知道如何解决;以前的帖子我几乎都查过了,这里的细节都讲的不很清楚,望高手指点!
 
你查查有关DDE的资料,也可以直接用参数传递,或者,干脆用一个内存映象保存一下数据结构,调用exe程序启动,exe程序读取映象中的数据,新建一个下载项目。另外,如果exe已经启动,ActiveXDLL再启动一个新的exe实例,实例判断查找另外一个已经存在的实例,把内存映象Handle用SendMessage发送给已经存在的exe实例,由已经存在的exe实例负责新建下载项目并下载,刚刚由ActiveXDLL启动的新exe实例自动退出。

思路应该很多,不只这点,楼主可以活学活用。
 
多谢!你提到的思路类似的我也想到过。我在Active Dll中用一个ShellExecute()函数启动了主程序,但是有两个问题不好解决:1.Active Dll是注册到系统的,取得的是系统目录,而不是Active Dll所在的目录,这样就找不到主程序的位置;2.最关键的问题是用ShellExecute()打开的主程序实际要解决两个进程间传递信息的问题,也就用到了DDE,但我觉得这样走了弯路,实现比较麻烦;我觉得把主程序做成自动化服务器是最方便的思路,现在只有一点细节需要解决,下面是以前帖子的内容,麻烦高手解释一下:
//--------------------------------------------------------------
.没有必要使用运行 WinExec 之类的函数去用过COM启动应用程序!实现方法:
a) 在Delphi 的 New 中创建 AxtiveX Library 创建类型库
b) 创建 Automation Object,并加入两个函数
procedure AddUrl(const Url: WideString; const Info: WideString; const Referer: WideString); safecall;
procedure AddUrlAll(var pList: OleVariant); safecall;
编译得到 .dll,并注册(Regist Ative Server)。IE右键菜单对应的脚本会创建
此 COM 并将 IE 中的元素信息 传给 COM 中...
c) 再创建一个正常的应用程序。给其加入 Automation Object,使其程序一个
自动化服务对象。增加与前 .dll 一样的 函数 以显示 捕获的信息。
d) 再打开 .dll 程序,在项目中加入应用程序创建的 ???_TBL.pas 单元。
在其AddUrl、AddUrlAll过程中创建 自动化服务接口(应用程序会自动运行)。
把参数传各 自动化服务的接口, 应用程序就捕获到 IE 的内容了。如:

procedure TIEDocCatch.AddUrl(const Url, Info, Referer: WideString);
var
FServer: IMyCOMSvr;
begin
FServer := CoMyCOMSvr.Create;
FServer.AddUrl(Url, Info, Referer);
FServer := nil;
end;

e) 因.dll是自动化服务的客户端,其运行完毕,应用程序也会同时关闭。
要不希望应用程序关闭。在程序启动后运行 _AddRef ,使自动化服务接口的
引用计数加一,程序关闭时 _Release 就可以了。
//---------------------------------------------------------------
_AddRef 这个关键的方法在什么地方应用???如何应用?我在自动化服务器主程序的Create事件里加入了它,但是调用主程序仍然会自动退出,请高手指定迷津,谢谢!
 
procedure TIEDocCatch.AddUrl(const Url, Info, Referer: WideString);
var
FServer: IMyCOMSvr;
begin
FServer := CoMyCOMSvr.Create;
FServer.AddUrl(Url, Info, Referer);
FServer._AddRef; //这里
FServer := nil;
end;

要不,你把前帖的位置告诉我,我去看看先。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=687260
上面的一段代码来自这个帖子。
相同的问题:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1649150
谢谢!
 
帖子里也没说具体位置,不过我猜测的(就是楼上的楼上)应该是对的,你试试看。这里CoMyCOMSvr应该是主程序的ActiveX对象(就是flashGet负责下载的那个功能的主程序),你试试看。
 
Method '_addref' not supported by automation object;自动化对象不支持此方法,我在自动化服务程序里单独加入一个过程调用_addref也出错。
 
顶者有分
 
[green]DFW有点冷清了,我自己解决吧。[/green][?][^][:(!][:(][8D][:D][:)]
 
后退
顶部