它们做了什么?。。。。//高手们来吧。。。。在线等

microboy 2006-09-21 04:27:21
问题:象Netant、FlashGet、迅雷的ActiveX如何与软件自身通讯的?方法请高手指教一二吧。。

FlashGet的IE菜单->使用网际快车下载->单击后->执行FlashGet文件夹里的jc_link.htm

jc_link.htm中的内容节选:
set JetCarCatch=CreateObject("JetCar.Netscape")
call JetCarCatch.AddUrl(Url, Info, external.menuArguments.document.Url)

问题来了,创建JetCar对象后。。这个AddURL是如何与flashget这个软件通讯的,也就是它执行之后
flashget就启动了。且出现了添加任务窗口。

当然,迅雷也类似
迅雷的IE菜单->使用迅雷下载->单击后->执行迅雷文件夹里的getAllurl.htm
内容节选:
set ThunderAgent = CreateObject("ThunderAgent.Agent.1")
call ThunderAgent.AddTask(links(i).href, "", "", links(i).innerText, strReferUrl)
call ThunderAgent.CommitTasks2(1)

迅雷是一定要CommitTask之后才出现主窗口的。。

请高人指教。。Activex与这些软件之间的通讯方法。。
软件未运行时如何通讯?
软件运行时如何通讯?
它们到底做了什么?。。。
...全文
494 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
microboy 2006-09-22
  • 打赏
  • 举报
回复
现在说到正题上了。。。我想知道的就是
主程序通讯采用的是什么方式,假如也是用的COM
那么可以认为这时迅雷的DLL是一个客户端,迅雷主程序是COM服务器,
有没有示例代码?或是实现方法?你可以告诉我有哪些通讯方法啊

microboy 2006-09-22
  • 打赏
  • 举报
回复
dddddddd
sdzeng 2006-09-21
  • 打赏
  • 举报
回复
IE中增加弹出菜单,是安装的时候通过在注册表
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt增加一项实现的

在菜单中点击“使用迅雷下载”,IE会打开getAllurl.htm网页,是因为在新增加的项目里指明了要调用的页面位置,这样在点击菜单后,IE会打开指定的页面

IE内嵌了VBScritp的解释器,在打开html页面时,能够解析并执行页面里的脚本
set ThunderAgent = CreateObject("ThunderAgent.Agent.1")
是一段VBScritp,IE会执行这一段代码,这时候IE是客户端,迅雷的DLL是COM服务器,

IE在执行call ThunderAgent.AddTask(links(i).href, "", "", links(i).innerText, strReferUrl)后,会出现迅雷主程序里的界面,那是因为迅雷的DLL和迅雷主程序之间又发生了通讯,我不太清楚迅雷的DLL和迅雷主程序通讯采用的是什么方式,假如也是用的COM
那么可以认为这时迅雷的DLL是一个客户端,迅雷主程序是COM服务器,
迅雷Dll在和IE通讯时,它是Server,在和迅雷主程序通讯时,它是Client

microboy 2006-09-21
  • 打赏
  • 举报
回复
自己顶
microboy 2006-09-21
  • 打赏
  • 举报
回复
嗯。。谢谢。有些明白了
大头鸟,那么我的问题中,迅雷或是快车的那些注册的dll中的函数是如何调用迅雷软件的呢?
CreateObject("ThunderAgent.Agent.1")
这个 thunderAgent.Agent我查过了,是迅雷的一个DLL注册的。
那么这个dll中肯定有存在和迅雷主程序通讯的部分。比如添加新任务时,这个dll是如何通知迅雷主程序的?
另外,你的4中写到,proxy/stub,是否可以是我上面提到的dll组件中和迅雷exe通讯的机制?
可否举个简单的例子来描述这个过程。需要掌握哪些知识?
分不够可以再加,不甚感谢!
sdzeng 2006-09-21
  • 打赏
  • 举报
回复
1、每一个COM对象都有一个唯一标识CLSID,这个CLSID不好记,因此COM对象又提供一个字符串ProgID,通过ProgID可以转换成CLSID。
CreateObject("ThunderAgent.Agent.1")首先进行的工作就是将ProgID转换成CLSID。

2、操作系统提供一个叫SCM(Service Control Manager)的东西,SCM根据CLSID在注册表找到对象所在的程序,如果是Dll方式,就加载,如果是EXE方式,则激活。

3、Dll形式的COM组件,叫做in-process server,客户端会直接加载这种COM组件,供客户端使用。因为DLL和客户端是在同一个内存空间里,客户端可以调用Dll的代码。

4、exe形式的COM组件,叫做out-process server,因为不在同一个进程里,双方先在各自进程里建立proxy/stub,然后才能通讯。Proxy和stub之间的通讯由操作系统完成,叫做LPC(本地过程调用)。如果Proxy和stub不在同一台机器上,则它们之间的有一层网络通讯,这个协议叫做RPC。

microboy 2006-09-21
  • 打赏
  • 举报
回复
我自己的测试程序中也已经实现了com的注册和IE右键菜单的响应了。
不过只是一个MessageBox,但是象下载类的软件。它响应菜单后,也就是那些com方法是如何和迅雷或是网际快车通讯的呢?
microboy 2006-09-21
  • 打赏
  • 举报
回复
下载软件都注册了一些com组件,一查就知道。
下载软件安装->注册com->IE点击->响应COM->Com通知应用程序?(如添加新任务啦)
大头鸟可否画个类似的过程来给小弟参考下?
microboy 2006-09-21
  • 打赏
  • 举报
回复
大头鸟?
执行的com就是由那几个link.htm来实现的。先创建对象。然后调用方法来添加新任务。
我想知道的是。这些方法中的具体细节是啥?我想这应该是和软件之间进行的通讯吧?
其实我想知道的是com如何通知应用程序的?方法有哪些?
软件未运行时如何通讯?
软件运行时如何通讯?
它们到底做了什么?。。。
sdzeng 2006-09-21
  • 打赏
  • 举报
回复
在安装这些软件的时候,会在windows里注册一些COM组件
注册时会把组件所在的路径写在注册表里
调用的时候,操作系统通过组件名找到对应的程序,
并执行程序中的代码
再详细的东西就不是几句能说清的了
建议你先看看《COM原理与应用》《COM本质论》

microboy 2006-09-21
  • 打赏
  • 举报
回复
自己顶。。。。。。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧