问题的起源:设置自己喜欢的浏览器为系统绝对默认的浏览器。
(修改.http等关联不是重点)
探索过程:
请看测试程序1:
Private Sub Form_Load()
WebBrowser1.Navigate "www.sina.com.cn"
End Sub
就这么一行代码,其他不做任何处理。当WebBrowser1打开网页后,随便点一个会打开新窗口的超链接,这个时候会发生什么事情?通常情况是IE打开了这个窗口。我们都知道新窗口是在WebBrowser1_NewWindow2事件中发生的,但为什么会打开IE呢?那一定是通过某种途径通知了IE。
继续研究,发现通知到这里:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32
起值="C:\Program Files\Internet Explorer\iexplore.exe"
调用的方式大约是Shell C:\Program Files\Internet Explorer\iexplore.exe -Embedding
为了证明我的猜测,请看测试程序2:
Private Sub Form_Load()
MsgBox Command
End Sub
用以监视调用参数,将其编译为c:\app2.exe,然后将上述注册表的值修改为c:\app2.exe,再在测试程序1中随便点一个会打开新窗口的超链接,这个时候又会发生什么事情?没有打开IE了,app2.exe执行了,并且MsgBox显示-Embedding,由此证明了调用的流程:没有处理WebBrowser1_NewWindow2的情况下,调用了HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32所指向的程序,带参数-Embedding
那问题就来了,当LocalServer32=IE或MT的时候,IE和MT等浏览器为什么能正确打开呢?请注意这里带的参数是-Embedding而并不是暴露的URL地址。
似乎唯一的解释就是IE和MT等在发现带-Embedding这个参数调用的时候从某个接口等获得了WebBrowser1_NewWindow2的ppDisp或URL。
而我们自己写的程序如何做到这一点呢?就象上面的测试程序2,当检测到-Embedding这个参数的时候如何正确打开呢?
请各路英雄详加指点,不胜感激!
-----------------------------------------------------
别人对我的有用的回复:
http://support.microsoft.com/kb/q160957/
-----------------------------------------------------
但我实在实现不了,无法检测到DDE……
(修改.http等关联不是重点)
探索过程:
请看测试程序1:
Private Sub Form_Load()
WebBrowser1.Navigate "www.sina.com.cn"
End Sub
就这么一行代码,其他不做任何处理。当WebBrowser1打开网页后,随便点一个会打开新窗口的超链接,这个时候会发生什么事情?通常情况是IE打开了这个窗口。我们都知道新窗口是在WebBrowser1_NewWindow2事件中发生的,但为什么会打开IE呢?那一定是通过某种途径通知了IE。
继续研究,发现通知到这里:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32
起值="C:\Program Files\Internet Explorer\iexplore.exe"
调用的方式大约是Shell C:\Program Files\Internet Explorer\iexplore.exe -Embedding
为了证明我的猜测,请看测试程序2:
Private Sub Form_Load()
MsgBox Command
End Sub
用以监视调用参数,将其编译为c:\app2.exe,然后将上述注册表的值修改为c:\app2.exe,再在测试程序1中随便点一个会打开新窗口的超链接,这个时候又会发生什么事情?没有打开IE了,app2.exe执行了,并且MsgBox显示-Embedding,由此证明了调用的流程:没有处理WebBrowser1_NewWindow2的情况下,调用了HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32所指向的程序,带参数-Embedding
那问题就来了,当LocalServer32=IE或MT的时候,IE和MT等浏览器为什么能正确打开呢?请注意这里带的参数是-Embedding而并不是暴露的URL地址。
似乎唯一的解释就是IE和MT等在发现带-Embedding这个参数调用的时候从某个接口等获得了WebBrowser1_NewWindow2的ppDisp或URL。
而我们自己写的程序如何做到这一点呢?就象上面的测试程序2,当检测到-Embedding这个参数的时候如何正确打开呢?
请各路英雄详加指点,不胜感激!
-----------------------------------------------------
别人对我的有用的回复:
http://support.microsoft.com/kb/q160957/
-----------------------------------------------------
但我实在实现不了,无法检测到DDE……