我在做一个类似迅雷的下载程序,做了个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
因为主程序是C#,所以最终改用C#写了一个BHO,为每个IE进程写了一个ServiceHost来进行IPC通讯。
第一次使用时,IE有没有让你允许这个插件运行呢?正常来说应该会有的,无论你是不是管理员模式运行IE。
还有,失败了请用GetLastError看看具体错误是什么。
当然,插件肯定是启用了。上面的那句 MsgBox "hook 失败" 被执行了,所以我说失败了。
@沧海一杰: GetLastError 是 0,GetCurrentProcessId返回的值是ie进程的ID
@沧海一杰:
0是代表成功呀,怎么可能是0呢?
@XiaoFaye: 但这确实是事实呀?我现在怀疑是不是非UI主线程无法调用这个函数。
IE 几?
你应该考虑使用别的方式来实现你的需求。
我现在是windows 8.1 IE 11, 你有没有更好方法呢? 我只是想在IE里做一个接口,需要的时候,我向这个接口发送域名链接,他可以返回对应的cookie.
@沧海一杰: 我刚才试验了,直接在active X dll里添加了一个Form1,然后让他隐藏,我想这样应该可以实现消息循环,但担心会不会有对性能影响太大,或者dll嵌入form会不会有其它的兼容性问题?
HBO我很熟,BHO不太熟