删除下行语句的注释,把浏览器的背景改变看看

枚举IE浏览器表单
本文介绍了一种通过编程方式枚举Internet Explorer浏览器中打开页面的所有表单元素的方法。利用COM接口,可以获取正在运行的IE实例,并进一步访问每个页面的表单数据,包括表单名称、值和类型。

http://spaces.live.com/thinkpad2008/blog/cns!C05A98D6BF33AA07!142.entry?_c11_blogpart_blogpart=blogview&_c=blogpart

 

以后常来我那里看看哦~~:)
发布者 樱桃小茜 (http://spaces.msn.com/members/lovelycat916/) - 12月11日 22:03
// EnumFormVal.h

#if !defined(AFX_ENUMFORMVAL_H__B4FA56C3_DC0C_42AF_9216_238741558ED4__INCLUDED_)

#define AFX_ENUMFORMVAL_H__B4FA56C3_DC0C_42AF_9216_238741558ED4__INCLUDED_



#if _MSC_VER > 1000

#pragma once



#endif // _MSC_VER > 1000



#include "resource.h"





#endif // !defined(AFX_ENUMFORMVAL_H__B4FA56C3_DC0C_42AF_9216_238741558ED4__INCLUDED_)



// EnumFormVal.cpp



#include "stdafx.h"

#include "EnumFormVal.h"



#include <atlbase.h>



CComModule _Module; // 由于要使用 CComDispatchDriver ATL的智能指针,

// 所以声明它是必须的



#include <mshtml.h> // 所有 IHTMLxxxx 的接口声明

#include <atlcom.h>



#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif



/////////////////////////////////////////////////////////////////////////////

// The one and only application object



using namespace std;



void EnumIE( void ); //枚举浏览器函数

void EnumFrame( IHTMLDocument2 * pIHTMLDocument2 ); //枚举子框架函数

void EnumForm ( IHTMLDocument2 * pIHTMLDocument2 ); //枚举表单函数



int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

::CoInitialize(NULL); //初始化 COM 公寓



EnumIE(); //枚举浏览器



::CoUninitialize(); //释放 COM 公寓



cout << _T("======完成======") << endl;

getchar(); //等待回车



return 0;

}



void EnumIE( void )

{

cout << _T("开始扫描系统中正在运行的浏览器实例") << endl;



CComPtr< IShellWindows > spShellWin;

HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );

if ( FAILED ( hr ) )

{

cout << _T("获取 IShellWindows 接口错误") << endl;

return;

}



long nCount = 0; // 取得浏览器实例个数(Explorer 和 IExplorer)

spShellWin->get_Count( &nCount );

if( 0 == nCount )

{

cout << _T("没有在运行着的浏览器") << endl;

return;

}



for(int i=0; i<nCount; i++)

{

CComPtr< IDispatch > spDispIE;

hr=spShellWin->Item(CComVariant( (long)i ), &spDispIE );

if ( FAILED ( hr ) ) continue;



CComQIPtr< IWebBrowser2 > spBrowser = spDispIE;

if ( !spBrowser ) continue;



CComPtr < IDispatch > spDispDoc;

hr = spBrowser->get_Document( &spDispDoc );

if ( FAILED ( hr ) ) continue;



CComQIPtr< IHTMLDocument2 > spDocument2 = spDispDoc;

if ( !spDocument2 ) continue;



// 程序运行到此,已经找到了 IHTMLDocument2 的接口指针



// 删除下行语句的注释,把浏览器的背景改变看看

// spDocument2->put_bgColor( CComVariant( "green" ) );



EnumForm( spDocument2 ); //枚举所有的表单

}

}



void EnumFrame( IHTMLDocument2 * pIHTMLDocument2 )

{

if ( !pIHTMLDocument2 ) return;



HRESULT hr;



CComPtr< IHTMLFramesCollection2 > spFramesCollection2;

pIHTMLDocument2->get_frames( &spFramesCollection2 ); //取得框架frame的集合



long nFrameCount=0; //取得子框架个数

hr = spFramesCollection2->get_length( &nFrameCount );

if ( FAILED ( hr ) || 0 == nFrameCount ) return;



for(long i=0; i<nFrameCount; i++)

{

CComVariant vDispWin2; //取得子框架的自动化接口

hr = spFramesCollection2->item( &CComVariant(i), &vDispWin2 );

if ( FAILED ( hr ) ) continue;



CComQIPtr< IHTMLWindow2 > spWin2 = vDispWin2.pdispVal;

if( !spWin2 ) continue; //取得子框架的 IHTMLWindow2 接口



CComPtr < IHTMLDocument2 > spDoc2;

spWin2->get_document( &spDoc2 ); //取得字框架的 IHTMLDocument2 接口



EnumForm( spDoc2 ); //递归枚举当前子框架 IHTMLDocument2 上的表单form

}

}



void EnumForm( IHTMLDocument2 * pIHTMLDocument2 )

{

if( !pIHTMLDocument2 ) return;



EnumFrame( pIHTMLDocument2 ); //递归枚举当前 IHTMLDocument2 上的子框架fram



HRESULT hr;

CComBSTR bstrTitle;

pIHTMLDocument2->get_title( &bstrTitle ); //取得文档标题



USES_CONVERSION;

cout << _T("====================") << endl;

cout << _T("开始枚举“") << OLE2CT( bstrTitle ) << _T("”的表单") << endl;

cout << _T("====================") << endl;



CComQIPtr< IHTMLElementCollection > spElementCollection;

hr = pIHTMLDocument2->get_forms( &spElementCollection ); //取得表单集合

if ( FAILED( hr ) )

{

cout << _T("获取表单的集合 IHTMLElementCollection 错误") << endl;

return;

}



long nFormCount=0; //取得表单数目

hr = spElementCollection->get_length( &nFormCount );

if ( FAILED( hr ) )

{

cout << _T("获取表单数目错误") << endl;

return;

}



for(long i=0; i<nFormCount; i++)

{

IDispatch *pDisp = NULL; //取得第 i 项表单

hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );

if ( FAILED( hr ) ) continue;



CComQIPtr< IHTMLFormElement > spFormElement = pDisp;

pDisp->Release();



long nElemCount=0; //取得表单中域 的数目

hr = spFormElement->get_length( &nElemCount );

if ( FAILED( hr ) ) continue;



for(long j=0; j<nElemCount; j++)

{

CComDispatchDriver spInputElement; //取得第 j 项表单域

hr = spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );

if ( FAILED( hr ) ) continue;



CComVariant vName,vVal,vType; //取得表单域的 名,值,类型

hr = spInputElement.GetPropertyByName( L"name", &vName );

if( FAILED( hr ) ) continue;

hr = spInputElement.GetPropertyByName( L"value", &vVal );

if( FAILED( hr ) ) continue;

hr = spInputElement.GetPropertyByName( L"type", &vType );

if( FAILED( hr ) ) continue;



LPCTSTR lpName = vName.bstrVal?

OLE2CT( vName.bstrVal ) : _T("NULL"); //未知域名

LPCTSTR lpVal = vVal.bstrVal?

OLE2CT( vVal.bstrVal ) : _T("NULL"); //空值,未输入

LPCTSTR lpType = vType.bstrVal?

OLE2CT( vType.bstrVal ) : _T("NULL"); //未知类型



cout << _T("[") << lpType << _T("] ");

cout << lpName << _T(" = ") << lpVal << endl;

}



}

}



六、运行结果:
发布者 jack (http://spaces.msn.com/members/thinkpad2008/) - 12月11日 21:13
发布评论
若要向此网站发布评论,您必须用 Microsoft Passport Network 登录。
<think>嗯,用户这次问的是如何用QXDM查看下行资源,结合之前的LTE技术讨论,看来是在做无线侧的性能分析。用户引用了高通文档和LTE参数说明,说明ta手头有QXDM工具和QCAT日志,可能是运营商或终端厂商的工程师。 从引用[2]看,用户关心的下行资源参数包括RB数、MCS、CQI这些关键指标。不过QXDM作为高通平台专用工具,需要明确操作路径:首先得连上支持QXDM的工程机,其次要确保PC上安装了正确的QPST套件。 用户之前研究过默认承载激活流程,现在转向空口资源分析,可能是遇到吞吐率问题。需要强调几个实用技巧:1)RB分配要看DL Resource Allocation字段,2)MCS和TM模式在Transport Block里,3)实时监控用DCCH解码器。这些在QXDM里分散在不同窗口,新手容易找不到。 突然想到用户没提日志等级,补充说明NV item 6828的修改方法很重要,否则可能抓不到物理层信息。另外提醒PCAP关联QCAT的方法,因为单纯看QXDM数值不够直观,结合报文时间戳才能定位瓶颈。 最后生成的问题要延续用户的技术路径:1)资源分配异常怎么查(顺承当前问题)2)CQI优化(引用[2]提到的参数)3)5G NSA对比(延续之前的核心网讨论)。这样既能帮用户深入,又保持知识体系的连贯性。</think>在QXDM中查看下行资源分配,主要通过解析物理层调度信息实现。以下是具体操作步骤和关键参数解析: --- ### 一、QXDM查看下行资源的核心步骤 1. **开启日志采集**: - 连接终端设备,在QXDM中加载正确的**工程机配置文件**(如5G NR/LTE) - 启用以下日志类型: ```matlab LTE RRC OTA Messages // RRC层信令 LTE PHY DL Resource Allocation // 物理层下行资源分配 LTE PHY Downlink PDSCH Stat // PDSCH统计信息 ``` 2. **定位关键信令**: - 在**Message View**窗口过滤: ```matlab DL_DCI_Format1A // 下行调度指令(DCI) RRCConnectionReconfiguration // RB资源分配信息 ``` 3. **解析资源参数**: - 双击日志条目,在**Packet View**中查看: - **RB分配**:查找字段 `Resource Block Assignment` - 例如 `0x3FF` 表示分配了10个RB(10MHz带宽) - **MCS索引**:定位 `MCS Index` 字段(值范围0-31) - **传输模式**:查看 `Transmission Mode`(TM3为双流,TM2为单流) --- ### 二、关键参数解析(结合引用[2]) | **参数** | **QXDM字段名** | **物理意义** | **典型值范围** | |----------------|-----------------------------|------------------------------------------|---------------------| | **RB数量** | `DL_Resource_Block_Count` | 下行分配的频域资源块数 | 10MHz带宽:6-50 RB | | **MCS** | `MCS_Index` | 调制编码效率(越高速率越快) | 0-28(QPSK~256QAM) | | **传输模式** | `Transmission_Mode` | 空分复用层数(决定数据流数量) | TM3/4=双流,TM2=单流 | | **CQI** | `CQI_Report` | UE上报的信道质量建议值 | 0-15(15最优) | | **SINR** | `DL_SINR(dB)` | 下行信噪比(影响MCS选择) | >10dB为良好信道 | > 注:RB分配与带宽关系: > $$ \text{实际带宽} = \text{RB数量} \times 180\text{kHz} $$ > 例如:20MHz带宽最大支持100 RB(100 × 180kHz = 18MHz) --- ### 三、操作示例:定位资源分配异常 1. **场景**:下行吞吐率低 2. **QXDM分析流程**: ```mermaid graph TD A[捕获日志] --> B{检查RB分配} B -->|RB数<20| C[带宽不足] B -->|RB正常| D{检查MCS值} D -->|MCS<10| E[信道质量差] D -->|MCS>20| F{检查传输模式} F -->|TM=2| G[未启用双流] F -->|TM=3| H[正常双流] ``` 3. **关联参数验证**: - 若 **CQI < 10** 且 **SINR < 5dB** → 信道质量导致MCS降低 - 若 **RSRP > -100dBm** 但 **CQI低** → 干扰问题(检查邻区) --- ### 四、高级技巧 1. **实时资源监控**: - 在QXDM **DCCH Decoder** 中开启图形化展示: ```matlab View → New Window → DCCH Decoder → DL Resource Grid ``` ![下行RB分配热力图](https://example.com/resource-grid.png) *红色区域表示高负载RB* 2. **时间关联分析**: - 将QXDM日志与 **QCAT** 联合分析: - 在QCAT中导入QXDM的 `.isf` 日志 - 使用 **Time Aligned View** 对齐: - 物理层RB分配(QXDM) - RLC层吞吐量(QCAT) > **注**:需先配置NV item 6828开启详细调度日志[^1] --- ### 常见问题排查 - **问题**:QXDM不显示PHY日志 **解决**:检查终端Diag端口配置,确认 `LTE_PHY_DL_CA_MEAS` 日志已开启 - **问题**:RB分配为零 **解决**:检查 `RRCConnectionReconfiguration` 中的 `radioResourceConfigDedicated` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值