• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 急OCX访问网页后,IE报异常

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了ie ocx,ie加载ocx控件,ie浏览器ocx控件,ie ocx控件安装,ie加载ocx等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 急 OCX访问网页后,IE 报异常
描述:

我把网上访问网页的代码封装了下 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();//这里报异常了。
}


解决方案1:

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

解决方案2:

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


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ie中使用ocx的问题?
  • 关于OCX用于IE,各位帮看一下问题出在哪
  • 求救!!ocx控件不能被ie调用
  • IE中不能正常加载ocx的问题。
  • IE调用OCX的问题,出现错误报告
  • ocx在IE中的消息传递是怎么回事?
  • [求助]OCX控件在IE浏览器上的问题!!!!!!
  • IE调用OCX使用出现加载故障
  • IE调用ocx问题
  • OCX在IE里,如何做到全屏,不是IE全屏,而是OCX全屏

相关文章

  • 2017-06-05 后台程序的问题
  • 2017-06-04 求NTGraphocx控件
  • 2017-06-04 请各位大下给小弟几本DELPHI写COM+的入门级电子文档,多谢,多谢!
  • 2017-06-05 高分求助:如何截获父进程或子进程结束信号?
  • 2017-06-04 custom接口怎么不可见?
  • 2017-06-05 Excel插件如何设置单元格的值(使用xlSet)?
  • 2017-06-05 我戳,OCX注册碰上鬼了~
  • 2017-06-04 请问在用ATL且不支持MFC的组件开发中,如何将从数据库中读到的DATE数据类型转挽回为字符串
  • 2017-06-04 如何使用循环(例如:数组)实现对多个串口初始化?
  • 2017-06-04 为何打开一次注册表,然后进行多次读的时候,老是出现错误呢?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请问有谁有《win32多线程程序设计》的cd-rom的源代码??
    • 初学com,疑惑多多,都是基础问题请大家不吝赐教!100分酬谢
    • 这段在活动目录中添加组的代码有什么问题么?
    • 在日文系统下,ie工具条一开,IE就死掉(kernell32dll出错,位置0000979d)
    • ActiveX在ActiveXControlTestContainer可执行。。。??
    • 我想做一个web上在线编辑word文件的控件,保存后自动上载到服务器,如何做呢?
    • 如何获得IFRAME中的webrowers的OnBeforeNavigate2事件?
    • 使用BHO获取弹出窗口的URL
    • ATLcom中多线程程序崩溃折腾3天了郁闷
    • 创建ActiveX控件,出错了?????高手快来!1111

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有