• 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 > 在ATL控件里执行htm文件中JavaScript函数的问题!

在ATL控件里执行htm文件中JavaScript函数的问题!

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

佚名通过本文主要向大家介绍了atl控件,atl34砂轮,atl方形动力电池,atl80.dll官方下载,atl71.dll一键修复等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 在ATL控件里执行htm文件中JavaScript函数的问题!
描述:

我使用下面的方法在ActiveX控件里调用JavaScript里的函数:
.h文件
IOleClientSite*      m_pClientSite;   //
IWebBrowser2*      m_spBrowser;    //
ComPtr<IHTMLDocument2>  m_spDoc;    //
.cpp文件
//----------------------------------------------------------------------------  
// 名称:InvokeJSFunc
// 简介:执行JavaScript里的函数
// 参数:strJSFuncName:i:JavaScript函数名
// 返回:执行成功返回TRUE,否则返回FALSE
//----------------------------------------------------------------------------  
BOOL COpenGLWnd::InvokeJSFunc(BSTR strJSFuncName)
{
    HRESULT hr = S_OK;
    ::IServiceProvider *isp, *isp2 = NULL;
    try
    {
        hr = m_pClientSite->QueryInterface(::IID_IServiceProvider, reinterpret_cast<void **>(&isp));
        if (FAILED(hr)) return FALSE;
        hr = isp->QueryService(::SID_STopLevelBrowser, ::IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
        if (FAILED(hr)) return FALSE;
        hr = isp2->QueryService(::SID_SWebBrowserApp, ::IID_IWebBrowser2, reinterpret_cast<void **>(&m_spBrowser));
        if (FAILED(hr)) return FALSE;
        //
        if(m_spDoc != NULL)
        {
            delete m_spDoc;
            m_spDoc = NULL;
        }
        hr = m_spBrowser->get_Document((IDispatch**)&m_spDoc);
        if(FAILED(hr)) return FALSE;
        //
        CComPtr<IDispatch> pScript;
        hr = m_spDoc->get_Script(&pScript);
        //
        CComBSTR bstrMember(strJSFuncName);
        DISPID dispid;
        hr =  pScript->GetIDsOfNames(::IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
        //
        DISPPARAMS dispparams;
        memset(&dispparams, 0, sizeof dispparams);
        dispparams.cArgs = 2;
        dispparams.rgvarg = new VARIANT[dispparams.cArgs];
        for( int i = 0; i < 2; i++)
        {
            CComBSTR bstr = "111"; // back reading
            bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
            dispparams.rgvarg[i].vt = VT_BSTR;
        }
        //
        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, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);
    }
    catch(...)
    {
        return FALSE;
    }
return (hr == S_OK ? TRUE : FALSE);
}
//----------------------------------------------------------------------------
我在C++Bulider的ActiveX Form工程里使用这个方法执行htm文件里的JavaScript函数,没有问题。但是在VC的atl工程里,使用这个方法就有点问题了。如果所执行的JavaScript函数里调用了控件本身的接口函数的话就会出现“指针错误”、“无效的被呼叫方”、甚至是崩溃的问题。例如执行函数:
  function StartEngine() {
Sun3D.S3D_SetCameraInfo(60, 100, 100000);
}
的时候就出现“无效指针”的错误,而且断点跟踪根本就没有进接口函数。如果把函数改成
  function StartEngine() {
alert("aaa");
}
又没有问题。
出现异常时,指向atlwin.h文件的
template <class TBase, class TWinTraits>
HWND CWindowImplBaseT< TBase, TWinTraits >::Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName,
DWORD dwStyle, DWORD dwExStyle, UINT nID, ATOM atom, LPVOID lpCreateParam)
{
ATLASSERT(m_hWnd == NULL);  //本句异常,因为m_hWnd不为空
……
}
不知道是不是atl和C++Bulider里有什么区别,希望知道的兄弟给个帮助!
谢谢!


解决方案1:

http://www.pconline.com.cn/pcedu/empolder/gj/vc/0312/259928.html
这里有啊。我有这个的列子。如果需要的话,留下email


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

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

  • 关于cabarc打包atl控件的问题,郁闷中~~~
  • ATL控件2问
  • 关于ATL做复合控件的问题
  • 大家一般都怎么打包Atl开发的ActiveX控件?
  • 使用ATL编写控件的接收器时,怎样在事件处理方法中得到事件源接口?
  • 请教,ATL写的ActiveX控件在IE中加载时接口的调用顺序
  • 在一个atl的复合控件项目中,如果调用其它ocx控件的方法??
  • 如何使用ATL编写的COM控件来播放AVI文件,需要在IE上使用的
  • 如何得到用ATL作的控件的窗口句柄,试了几个都无效,怎么回事?
  • 想用ATL做个控件,但这是怎么回事?

相关文章

  • 2017-06-05 B/S结构视频通信
  • 2017-06-04 关于VC语言下Excel打印预览已选定多sheet的问题
  • 2017-06-05 看看这些vc中关于word代码,创建dispatch怎么总是failed?
  • 2017-06-04 请教请教请教请教yonsmYonsm哪里能下载直接使用TWAIN数据源管理程序的例子?
  • 2017-06-05 通过outlookwebaccess发送的邮件可否截获
  • 2017-06-04 如何写一个编码输出来接收的FILTER
  • 2017-06-05 向tttydwshcdr版主提问,高分求解
  • 2017-06-04 ApplicationEvents与IApplicationEvents的区别
  • 2017-06-04 IE中如何实现串口监视?
  • 2017-06-05 c++下调用dll!!

文章分类

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

最近更新的内容

    • 请教各位,“金山卫士”用的是不是COM技术
    • OCX控件如何与包容器(比如word)进行通信呢??困难啊
    • COM读取文件内容,读取最后50000个字节以上显示结果不对
    • 如何在visualc++用win32汇编写的dll文件,关键是返回值问题。
    • 问Richedit里复制ole对象问题
    • vc与matlab混合编程出现的怪异问题
    • 那位兄弟帮忙看看这个warning会是什么问题
    • 动态链接库释放资源的问题????
    • 关于COMElevationMoniker
    • 远程调用权限问题

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

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