求教一个关于通过ATL COM技术及IHTMLDocument2接口等取网页中“Input”文本框中的文本

信阳毛尖 2010-08-24 02:47:52
部分代码如下:
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];

::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
}

void CAboutIHTMLDocument2Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HWND qqMailWin = NULL;
USES_CONVERSION;

qqMailWin=::FindWindowEx(NULL,NULL,"IEFrame","QQ邮箱 - 写信 - Microsoft Internet Explorer");
//qqMailWin=::FindWindowEx( NULL, NULL, "IEFrame", "2010年河南省高校门户网站评选 - Microsoft Internet Explorer"); //
if(qqMailWin==NULL)
{
DWORD err=::GetLastError();
::AfxMessageBox("找不到写信窗口");
}


CoInitialize( NULL );
HINSTANCE hInst = ::LoadLibrary(_T("OLEACC.DLL"));
if ( hInst != NULL )
{
if( qqMailWin != NULL )
{
HWND hWndChild = NULL;
::EnumChildWindows(qqMailWin,EnumChildProc, (LPARAM)&hWndChild );
if ( hWndChild )
{
CComPtr<IHTMLDocument2> spDoc;
LRESULT lRes;

UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, (LPCSTR)"ObjectFromLresult" );
if( pfObjectFromLresult !=NULL )
{
HRESULT hr;
hr = pfObjectFromLresult( lRes,IID_IHTMLDocument2,0,(void**)&spDoc );


if ( SUCCEEDED(hr) )
{
// 获取各个控件
CComQIPtr < IHTMLElementCollection > spElementCollection;
hr = spDoc->get_forms(&spElementCollection);

long nFormCount=0; //取得表单数目
hr = spElementCollection->get_length( &nFormCount );
if (nFormCount==0)
::AfxMessageBox("表单数目为0");

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 strTextType= _T("hidden");


LPCTSTR strElementType = vType.bstrVal ? OLE2CT( vType.bstrVal ) : _T("NULL");
LPCTSTR strElementName = vName.bstrVal ? OLE2CT( vName.bstrVal ) : _T("NULL");
LPCTSTR strValue = vVal.bstrVal ? OLE2CT(vVal.bstrVal) : _T("NULL");

if( StrCmp( strTextType,strElementType) == 0)
{
if( StrCmp( strElementName, _T("fun")))
{
::AfxMessageBox("找到输入框!!");
CComBSTR str = NULL;
CComQIPtr < IHTMLInputTextElement > spGetText(spInputElement); hr = spGetText->get_value(&str);
if( SUCCEEDED(hr) )
{
if( str.Length() != 0 )
{
CComBSTR msg=_T("输入框类容是:");
msg += str;
CString s( str );
::AfxMessageBox( s );
}
}
}
else
::AfxMessageBox("没有找到输入框!!");
}

}//for j


}//for i
}
}

}

}
::BringWindowToTop(qqMailWin);
::FreeLibrary( hInst );
}
CoUninitialize();
OnOK();
}

编译无误,单步执行的时候执行到 上文中红色字体的地方:hr = spGetText->get_value(&str);出错,就是弹出那个“Microsoft Visual C++ Debug Library”(有“终止,重试,忽略”)的框框,说是Debug Assertion Failed!我觉得是上文中蓝色字体地方CComQIPtr < IHTMLInputTextElement > spGetText(spInputElement);不准确吧,不知道这种赋值方式对不对!如果不对,那么该如何把CComDispatchDriver类型的“spInputElement”转换成(还是赋值?) IHTMLInputTextElement接口类型的“spGetText”呢? 或者,还有其他的途径取出文本框中的文本方法嘛?
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2010-08-31
  • 打赏
  • 举报
回复
问题已解决,结贴啦
信阳毛尖 2010-08-27
  • 打赏
  • 举报
回复
这两天杂事比较多...看了看,觉得没头绪,我想还是先得把Frame框架搞清楚再说
向立天 2010-08-24
  • 打赏
  • 举报
回复
查查MSDN
看看有没有相关说明
信阳毛尖 2010-08-24
  • 打赏
  • 举报
回复
我查了些资料,可能是qq写信那个网页是基于frame框架的,其中的的那个正文文本域的type好像是textarea,好了,基于form的网页控件访问已基本掌握,只是这个基于frame框架的,还没有实现,哪位大侠给看看上文的代码要是改写一下,该如何改写呀?

我只会做到
.....
.....
.....
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, (LPCSTR)"ObjectFromLresult" );
if( pfObjectFromLresult !=NULL )
{
HRESULT hr;
hr = pfObjectFromLresult( lRes,IID_IHTMLDocument2,0,(void**)&spDoc );


if ( SUCCEEDED(hr) )
{
// 获取各个控件
//CComQIPtr < IHTMLElementCollection > spElementCollection; 把原来的这一句换成下一句
CComQIPtr < IHTMLFramesCollection2 > spElementCollection;
//hr = spDoc->get_forms(&spElementCollection); 把原来的这一句换成下一句
hr = spDoc->get_frames(&spElementCollection);

信阳毛尖 2010-08-24
  • 打赏
  • 举报
回复
犯了一个错误,上文中蓝色字体地方的接口应该是CComQIPtr < IHTMLInputHiddenElement > spGetText(spInputElement),这样就不会出错了,但是取不出文本的值!!!!!这个网页就是qq写信那个网页,倘若换成其他的网页,有的可以取出来,有的也不可以,这是怎么回事?
内容概要:本文研究了一种基于遗传算法的新型异构分布式系统任务调度算法,旨在解决异构计算环境任务分配与调度的复杂优化问题。通过Matlab代码实现该算法,充分利用遗传算法强大的全局搜索能力和鲁棒性,对任务执行时间、资源利用率、系统负载均衡等关键性能指标进行综合优化,有效提升分布式系统的整体运行效率与稳定性。研究详细阐述了算法的整体架构设计、染色体编码策略、适应度函数构造、选择机制以及交叉与变异等遗传操作的实现细节,并通过大量仿真实验验证了所提出算法相较于传统调度方法在收敛速度、解的质量和调度性能方面的显著优越性。; 适合人群:具备一定编程基础和优化算法理论知识,从事分布式计算、高性能计算、云计算资源调度或智能优化算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于高性能计算、云计算、边缘计算等异构计算平台的任务调度优化,提升资源利用效率;②为研究人员提供遗传算法在复杂组合优化问题应用的完整实现案例,深化对智能优化算法设计原理与仿真实践的理解; 阅读建议:建议读者结合提供的Matlab代码深入研读,重点理解适应度函数的设计逻辑与遗传算子的参数调优策略,并可通过更换不同的任务集和系统模型来测试算法的泛化能力与鲁棒性。
参考李林凤等(2025)一文关于农村劳动力人均受教育年限指标的构建与计算方法,整理了国31个省份总体、分性别的农村人均受教育年限数据,具体计算方法如下: 农村劳动力人均受教育年限 = (农村未上过学人数 × 1+小学学历人数 × 6+初学历人数 × 9+高专学历人数 ×12+大专及以上学历人数 × 16)/农村6岁及以上总人口 相关数据:各地区、分性别人均受教育年限数据 一、数据介绍 数据名称:国各省农村人均受教育年限 数据范围:全国31个省份 时间范围:2006-2024年 样本数量:590条 数据来源:《国人口和就业统计年鉴》、《国劳动统计年鉴》 二、数据指标 年份 省份 省份代码 农村人均受教育年限 男性-农村人均受教育年限 女性-农村人均受教育年限 6岁及以上人口 6岁及以上人口_男 6岁及以上人口_女 未上过学人口 未上过学人口_男 未上过学人口_女 小学人口 小学人口_男 小学人口_女 初人口 初人口_男 初人口_女 高人口 高人口_男 高人口_女 大专及以上人口 大专及以上人口_男 大专及以上人口_女 三、参考文献 [1]李林凤,刘杨,杨亦民.种业创新驱动农村产业融合的作用机制与空间分异效应[J].广东财经大学学报,2025,40(6):97-109. [2]徐小阳,李洁,金丽馥.普惠金融对农村教育贫困的纾解效应[J].国农村经济,2020,(9):41-64.
内容概要:本文围绕基于改进秃鹰算法的微电网群经济优化调度展开研究,提出了一种结合智能优化算法的调度模型,旨在实现微电网群运行过程的成本最小化与能源利用效率最大化。研究详细阐述了改进秃鹰算法的原理与优化机制,将其应用于含分布式电源、储能系统及多元负荷的微电网群多目标经济调度问题,充分考虑系统运行约束与能源交互特性,构建了完整的数学模型,并通过Matlab代码实现了算法仿真与结果验证。该资源不仅提供了核心算法代码,还整合了电力系统建模、智能优化、仿真分析等关键技术,形成一套完整的科研复现体系,有助于深入理解先进优化算法在现代能源系统的实际应用。; 适合人群:具备电力系统基础、优化算法理论及Matlab编程能力的研究生、科研人员和工程技术人员,特别适用于从事微电网、综合能源系统、智能调度等领域研究的专业人士。; 使用场景及目标:①复现并验证改进秃鹰算法在微电网群经济调度的有效性;②掌握智能优化算法在复杂电力系统调度问题的建模与求解方法;③依托所提供的Matlab代码开展学术论文复现、科研项目开发或工程方案设计;④拓展应用于储能优化、电动汽车调度、多能协同等关联领域的创新研究。; 阅读建议:建议读者结合文本说明与Matlab代码同步实践,重点关注算法实现细节、模型构建逻辑与参数设置方法,通过仿真实验加深对优化过程的理解,并尝试将该方法迁移至其他类似优化问题进行对比分析与创新改进。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧