首页 新闻 搜索 专区 学院

如何与BHO插件交互?

0
悬赏园豆:20 [已解决问题] 解决于 2014-11-24 10:15

我在做一个类似迅雷的下载程序,做了个BOH插件。想在下载某个资源时,通过BHO拿到对应域名的Cookie。因为有些网站是需要登录后才能下载,所以必须要拿到Cookie才能下载。

我的思路是主程序(下载程序)在需要某个域名时,通过SendMessage向BOH发送消息来达到通信的目的。

但我在BHO插件里用下面的代码执行失败,BHO插件应该已经算是IE的一部分了,所以应该不算是跨进程了,但为什么会执行失败呢?

相关代码如下:

Private Sub IObjectWithSite_SetSite(ByVal pSite As IObjectWithSiteTLB.IUnknownVB)
    Set M_Site = pSite
    Set IE = pSite
    If preWinProc = 0 And IE.hwnd > 0 Then
        MsgBox Hex(IE.hwnd)
        Dim ret As Long
        '记录原来的Window Procedure的位址
        preWinProc = GetWindowLong(IE.hwnd, GWL_WNDPROC)
        '设定form的window Procedure到wndproc
        ret = SetWindowLong(IE.hwnd, GWL_WNDPROC, AddressOf wndproc)
        If ret > 0 Then
            MsgBox "hook 成功"
        Else
            MsgBox "hook 失败"
        End If
    End If
End Sub
问题补充:

主要是调用SetWindowLong失败,为什么呢?

空明流光的主页 空明流光 | 初学一级 | 园豆:62
提问于:2014-11-19 10:00
< >
分享
最佳答案
0

因为主程序是C#,所以最终改用C#写了一个BHO,为每个IE进程写了一个ServiceHost来进行IPC通讯。

空明流光 | 初学一级 |园豆:62 | 2014-11-24 10:14
其他回答(3)
0

第一次使用时,IE有没有让你允许这个插件运行呢?正常来说应该会有的,无论你是不是管理员模式运行IE。

还有,失败了请用GetLastError看看具体错误是什么。

收获园豆:8
XiaoFaye | 园豆:3082 (老鸟四级) | 2014-11-19 10:15

当然,插件肯定是启用了。上面的那句 MsgBox "hook 失败" 被执行了,所以我说失败了。

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2014-11-19 10:17

@沧海一杰: GetLastError 是 0,GetCurrentProcessId返回的值是ie进程的ID

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2014-11-19 10:30

@沧海一杰: 

0是代表成功呀,怎么可能是0呢?

支持(0) 反对(0) XiaoFaye | 园豆:3082 (老鸟四级) | 2014-11-19 10:47

@XiaoFaye: 但这确实是事实呀?我现在怀疑是不是非UI主线程无法调用这个函数。

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2014-11-19 10:58
0

IE 几?

你应该考虑使用别的方式来实现你的需求。

收获园豆:8
Launcher | 园豆:45045 (高人七级) | 2014-11-19 11:57

我现在是windows 8.1 IE 11, 你有没有更好方法呢? 我只是想在IE里做一个接口,需要的时候,我向这个接口发送域名链接,他可以返回对应的cookie.

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2014-11-19 13:18

@沧海一杰: 我刚才试验了,直接在active X dll里添加了一个Form1,然后让他隐藏,我想这样应该可以实现消息循环,但担心会不会有对性能影响太大,或者dll嵌入form会不会有其它的兼容性问题?

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2014-11-19 13:20
0

HBO我很熟,BHO不太熟

收获园豆:4
+小马哥++ | 园豆:906 (小虾三级) | 2014-11-19 16:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册