CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

急 OCX访问网页后,IE 报异常

楼主asdmusic8(asdmusic8)2005-04-04 14:32:55 在 VC/MFC / ATL/ActiveX/COM 提问

我把网上访问网页的代码封装了下   OcxJavaScript    
  #include   "stdafx.h"  
  #include   "SmartOCXCtl.h"  
  #include   "OcxJavaScript.h"  
   
  COcxJavaScript::COcxJavaScript(LPVOID   handle)  
  {  
  m_pIWebBrowser=NULL;  
  m_pDocument=NULL;  
  m_pScript=NULL;  
  m_handle=(CSmartOCXCtrl*)handle;  
  CoInitializeEx(NULL,   COINIT_MULTITHREADED);  
  }  
   
  COcxJavaScript::~COcxJavaScript()  
  {  
  CoUninitialize();  
  }  
   
  BOOL   COcxJavaScript::GetIWebBrowser()  
  {  
  IOleClientSite*   pClientSite;  
   
  if   (m_handle==NULL)   return   FALSE;  
  pClientSite=m_handle->GetClientSite();    
  if(pClientSite==NULL)return   FALSE;  
  CComQIPtr<IServiceProvider>   pISP(pClientSite);  
  if(pISP==NULL) return   FALSE;  
  pISP->QueryService(IID_IWebBrowserApp,   IID_IWebBrowser2,(void   **)&m_pIWebBrowser);  
  if(m_pIWebBrowser==NULL)  
  return   FALSE;  
  m_pIWebBrowser->get_Document((IDispatch**)&m_pDocument);  
  if(m_pDocument==NULL)  
  return   FALSE;  
  m_pDocument->get_Script(&m_pScript);  
  if(m_pScript==NULL)  
  return   FALSE;  
  return   TRUE;  
  }  
   
  HRESULT   COcxJavaScript::RunScript(LPCSTR   szFunctionName,   int   nParams,   ...)  
  {  
  CComPtr<IDispatch>   pScript;  
  HRESULT   hr   =   m_pDocument->get_Script(&pScript);  
  if   (SUCCEEDED(hr))  
  {  
  CComBSTR   bstrMember(szFunctionName);  
  DISPID   dispid;  
  hr   =   pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);  
  if   (SUCCEEDED(hr))  
  {  
  DISPPARAMS   dispparams   =   {   NULL,   NULL,   0,   0   };  
  dispparams.cArgs   =   nParams;  
  va_list   args;  
  va_start(args,nParams);  
  VARIANT   *pArgs   =   new   VARIANT[nParams+1];  
  ZeroMemory(pArgs,   (nParams+1)   *   sizeof   (VARIANT));  
   
  for   (int   i=0;   i<nParams;   i++)  
  {  
  LPCSTR   p   =   va_arg(args,LPCSTR);  
  CComBSTR   bstr   =   p;  
  bstr.CopyTo(&pArgs[i].bstrVal);  
  pArgs[i].vt   =   VT_BSTR;  
  }  
  va_end(args);  
  dispparams.rgvarg   =   pArgs;  
  DISPID   dispidPut   =   DISPID_PROPERTYPUT;  
  dispparams.rgdispidNamedArgs   =   &dispidPut;  
   
  dispparams.cNamedArgs   =   0;  
  EXCEPINFO   excepInfo;  
  memset(&excepInfo,   0,   sizeof   excepInfo);  
  CComVariant   vaResult;  
  UINT   nArgErr   =   (UINT)-1;     //   initialize   to   invalid   arg  
  hr   =   pScript->Invoke   (dispid,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);  
   
  if   (nParams   >   0)  
  delete   []   pArgs;  
  }  
  }  
  return   hr;  
  }  
  头文件  
  #include   "Atlbase.h"  
  #include   "Mshtml.h"  
  #include   <oleacc.h>  
   
  class   CSmartOCXCtrl;  
  class   COcxJavaScript      
  {  
  public:  
  COcxJavaScript(LPVOID   handle);  
  virtual   ~COcxJavaScript();  
  private:  
  CComPtr<IWebBrowser2>   m_pIWebBrowser;  
  CComPtr<IHTMLDocument2>   m_pDocument;  
  CComPtr<IDispatch>   m_pScript;  
  CSmartOCXCtrl   *m_handle;  
  IWebBrowser2   *browser;  
  public:  
  BOOL   GetIWebBrowser();  
  HRESULT   RunScript(LPCSTR   szFunctionName,   int   nParams,   ...);  
  };  
   
   
  然后在调用的地方。我是线程发消息调用OnFireShowMessEventForThread。  
  //提示信息  
  LRESULT   CSmartOCXCtrl::OnFireShowMessEventForThread(WPARAM   wParam,   LPARAM   lParam)  
  {  
      LPCTSTR   lp=(LPCTSTR)wParam;    
      COcxJavaScript     ocxj(this);  
      if(ocxj.GetIWebBrowser())  
      {  
          ocxj.RunScript("showmess",1,lp);  
      }  
      return   TRUE;  
  }  
  但是如果网页放在本机运行,没有异常,能正常工作。但如果网页放在其它电脑上。我打开的话,就报异常了。经过调试发现m_pDocument->get_Script(&m_pScript);       该函数没有得到m_pScript。  
  继续跟踪发现  
  ~CComPtr()  
  {  
      if   (p)  
  p->Release();//这里报异常了。  
  }  
  问题点数:100、回复次数:4Top

1 楼signoft(晴天)回复于 2005-04-04 15:14:49 得分 10

~CComPtr()  
  {  
      if   (p)  
  p->Release();//这里报异常了。  
  }  
  如果确定在这里发现异常,应该是你提前把p释放掉了  
  楼主调试一下看看Top

2 楼asdmusic8(asdmusic8)回复于 2005-04-04 15:35:58 得分 0

我知道问题在什么地方了     我本地的时候是没有框架的     而远程的是有框架的。遇到的问题和  
  http://dev.csdn.net/develop/article/64/64164.shtm       一样。在框架下get_Script   失败了,之不过怎么这个智能指针释放的时候有问题了。  
  在64164.shtm   回答   是hr   =   isp->QueryService(SID_STopLevelBrowser,   IID_IServiceProvider,   reinterpret_cast<void   **>(&isp2));  
  这不明摆是要访问顶层框架么?  
  m_pClientSite的container就是HTMLDocument对象,Get一下Container就可以了  
  而我代码中没有STopLevelBrowser     ,而是直接   做IWebBrowserApp     那按他所说   m_pClientSite的container就是HTMLDocument对象,Get一下Container     该怎么写呢Top

3 楼fool_leave(请及时结贴)回复于 2005-04-04 15:42:38 得分 0

你怎么会在两个地方调用m_pDocument->get_Script  
  在GetIWebBrowser调用过了,然后又RunScript调用.Top

4 楼fool_leave(请及时结贴)回复于 2005-04-04 16:10:43 得分 90

hr   =   m_pClientSite->GetContainer(&pOleContainer);  
  hr   =   pOleContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast<void   **>(&pHTMLDocument));  
   
   
  Top

相关问题

  • 通过IE的组件AxSHDocVw访问网页后,如何能得到该网页的源代码?
  • 如何使IE的地址栏不保存访问的网页地址?
  • 访问网页的问题
  • 怎样修改才能越过IE的默认页设置,使进入IE时直接访问某个网页。
  • 急,我用IE访问某个网页只需5、6秒,为什么在vb中用api:InternetReadFile访问,需要4、5分钟呢?谢谢
  • 在VB中如何访问IE的历史记录啊,我想用程序得到最近都访问过那些网页?
  • 我想用VC++和网页结合写一个网页,把访问过我们单位的IE的主页设成主页?
  • 高分求教,网页访问统计!
  • 关于网页的访问权限
  • 无法访问链接的网页

关键词

  • 网页
  • hr
  • 框架
  • cocxjavascript
  • pscript
  • nparams
  • pclientsite
  • piwebbrowser
  • pdocument
  • csmartocxctrl

得分解答快速导航

  • 帖主:asdmusic8
  • signoft
  • fool_leave

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo