var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2009年09月03日

    为何无法录制QTP启动前的浏览器

    分类:

    Why do we need to launch application after QTP?中说无法录制QTP启动前的应用程序是因为QTP启动后hook才开始运行。实际上无论线程特定/全局hook,自安装hook起,大部分类型的hook就被系统自动加载到钩子程序自身或其它进程中去了,但WH_KEYBOARD对应的KeyboardProcWH_MOUSE对应的MouseProc只在应用程序调用GetMessage或者PeekMessage之后才被系统调用,WH_KEYBOARD_LL对应的LowLevelKeyboardProcWH_MOUSE_LL对应的LowLevelMouseProc并不加载到其它进程中而是通过钩子程序接受消息再处理然后发送到被键盘或鼠标聚焦(focus)的窗口消息队列。所以,鼠标和键盘两类钩子对后台运行的程序比较难。

     

    本文启动QTP 10加载了Web插件,观察到了以下事实:

    1.    通过在MSIE中启用/关闭该BHO,证实能否在MSIE浏览器上录制同其上插件BHOManager.dll无关。

    2.    QTP启动前启动MSIE能识别MSIE整个窗口为Windows Internet Explorer对象。通过Process Explorer观察QTP启动前后启动的MSIE加载dll的情况(见Before_QTP_LaunchAfter_QTP_Launch,图片均取自QTP启动后),发现QTP启动前启动的MSIE加载dll少于QTP启动后启动的MSIE,这也正是无法录制QTP启动前启动MSIE的原因。通过Process Explorer观察QTP启动前后启动的窗口程序如记事本加载dll的情况 (见Window)发现,QTP前后启动并无差异。

    3.    QTP启动前后启动的程序Sleipnir,发现QTP总无法录制对Sleipnir中网页的操作。通过Process Explorer观察进程Sleipnir.exe发现QTP把它识别成了窗口程序,而Sleipnir实际上是基于MSIE核心的一款浏览器。

     

    通过Process Explorer还发现QTP hook加载入其他进程首先通过MicAgentInjector.dllbbHookLoader.dll

     

    所以这个问题应该是QTPbug,感觉其对“Internet Explorer_Server”的判断存在诸多问题。


    【资源】

    What are all the differences between WH_MOUSE and WH_MOUSE_LL hooks? Diff b/w MouseProc & LowLevelMouseProc

    做一个检测钩子程序的工具

    分享到: