• 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 > VC中如何调用Script中的函数?

VC中如何调用Script中的函数?

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

佚名通过本文主要向大家介绍了java script函数,script5002 缺少函数,typescript 构造函数,script的函数,typescript 函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: VC中如何调用Script中的函数?
描述:

脚本中传来的函数指针是LPDISPATCH,如果直接用ChangeType转为String,得到的结果是包含函数代码在内的整个函数而不是函数名[即便能通过分析来获得...],请问我要如何能够通过这个Dispatch指针来调用这个函数呢?
难道只能生成一个调用字符串插入执行吗?


解决方案1:

函数对象用DISPID=0来调用。
pObj->Invoke(0,IID_NULL,0,DISPATCH_METHOD,&Params,&result,NULL,NULL);

解决方案2:

通过GetTypeInfo可以获得类型信息
参见http://www.csdn.net/develop/read_article.asp?id=21702
HRESULT CIEAutomationView::DumpTypeInfo(LPDISPATCH pDisp)
{
if(pDisp==NULL)return OLE_E_BLANK;
CComPtr<ITypeInfo> pTypeInfo;
HRESULT hr = S_OK;
hr= pDisp->GetTypeInfo(0, GetUserDefaultLCID(), &pTypeInfo);
if(FAILED(hr))return hr;
CSmartTypeAttr pTypeAttr( pTypeInfo );
CSmartFuncDesc pFuncDesc( pTypeInfo );
hr= pTypeInfo->GetTypeAttr( &pTypeAttr );
if(FAILED(hr))return hr;
for(int iMethod = 0; iMethod < pTypeAttr->cFuncs; iMethod++){
hr= pTypeInfo->GetFuncDesc(iMethod, &pFuncDesc);
if(FAILED(hr))return hr;
CString strInvokeType;
switch(pFuncDesc->invkind){
case INVOKE_FUNC :strInvokeType="Function";break;
case INVOKE_PROPERTYGET :strInvokeType="Property(Get)";break;
case INVOKE_PROPERTYPUT :strInvokeType="Property(Put)";break;
case INVOKE_PROPERTYPUTREF:strInvokeType="Property(Putref)";break;
default:break;
}
CComBSTR bstrName;
unsigned int nNames;
hr= pTypeInfo->GetNames(pFuncDesc->memid, &bstrName, 1,&nNames );
if(FAILED(hr))return hr;
ASSERT( nNames == 1 );
TRACE("%s\t%s\r\n",CString(bstrName.m_str),strInvokeType);
pFuncDesc.Release();
}
return S_OK;
}
void CIEAutomationView::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR lpszUrl)
{
// make sure the main frame has the new URL.  This call also stops the animation
((CChildFrame*)GetParentFrame())->SetAddress(lpszUrl);
CString strURL(lpszUrl);
IUnknown* pUnkBrowser = NULL;
    IUnknown* pUnkDisp = NULL;
TRACE(_T("Document %s Done\r\n"),lpszUrl);
//is it top level document?
HRESULT hr = m_pBrowserApp->QueryInterface( IID_IUnknown,  (void**)&pUnkBrowser);
if ( SUCCEEDED(hr) ){
        hr = pDisp->QueryInterface( IID_IUnknown,  (void**)&pUnkDisp );
        if ( SUCCEEDED(hr) ){
            if ( pUnkBrowser == pUnkDisp ){
//top level
m_spHtmlDoc=NULL;
hr=m_pBrowserApp->get_Document(&m_spHtmlDoc);
TRACE(_T("Downloading Complete\r\n"),lpszUrl);
DumpTypeInfo(m_spHtmlDoc);
CComQIPtr<IHTMLDocument2> pHtmlDoc(m_spHtmlDoc);
IShellBrowser* pShellBrowser=(IShellBrowser*)m_wndBrowser.SendMessage(WM_USER+7,0,0);
if(pHtmlDoc){
CComPtr<IHTMLWindow2> pWindow;
pHtmlDoc->get_parentWindow(&pWindow);
CComQIPtr<IDispatch> spWindow(pWindow);
m_domExternal.SetMenuArguments(spWindow);
}
if(pShellBrowser){
CComPtr<IShellView> pIShellView;
pShellBrowser->QueryActiveShellView(&pIShellView);
if(pIShellView){
FOLDERSETTINGS fs;
pIShellView->GetCurrentInfo(&fs);
CComQIPtr<IFolderView> pIFolderView(pIShellView);
if(pIFolderView){
pIFolderView->SetCurrentViewMode(FVM_DETAILS);
}
}
TRACE("Get Shell Browser\r\n");
}
}
pUnkDisp->Release();
}
pUnkBrowser->Release();
}
}
void CIEAutomationView::CallScript(IHTMLWindow2* pWindow2
,BSTR bstrCode
,BSTR bstrLanguage)
{
ASSERT(pWindow2);
HRESULT hr = S_OK;
COleVariant ret;
hr = pWindow2->execScript(bstrCode, bstrLanguage, &ret);
}
void CIEAutomationView::CallScriptDirect(IHTMLWindow2* pWindow2
,BSTR bstrMethod)
{
DISPID dispidScriptObject, dispidMethodToInvoke;
IDispatch *pDispScriptObject;
DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0};
HRESULT hr;
OLECHAR *szScript = L"script";
OLECHAR *szFuncName = bstrMethod;
IHTMLDocument2* pDocument2 = NULL;
hr = pWindow2->get_document(&pDocument2);
ASSERT(SUCCEEDED(hr) && pDocument2);
IDispatch* pDocDisp = NULL;
hr = pDocument2->QueryInterface(IID_IDispatch, (void**)&pDocDisp);
ASSERT(SUCCEEDED(hr) && pDocDisp);
// Get the DISPID of the document's Script property.
hr = pDocDisp->GetIDsOfNames(IID_NULL, &szScript,
1, LOCALE_USER_DEFAULT, &dispidScriptObject);
ASSERT(SUCCEEDED(hr));
COleVariant varResult;
// Get the document's Script property.
hr = pDocDisp->Invoke(dispidScriptObject,
IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &varResult, NULL, NULL);
ASSERT(SUCCEEDED(hr) && varResult.pdispVal);
pDispScriptObject = varResult.pdispVal;
varResult.Clear();
// Get the DISPID of the script method to invoke.
hr = pDispScriptObject->GetIDsOfNames(IID_NULL, &szFuncName, 1, 
LOCALE_USER_DEFAULT, &dispidMethodToInvoke);
ASSERT(SUCCEEDED(hr));
// Invoke the script method.
hr = pDispScriptObject->Invoke(dispidMethodToInvoke, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, 
&varResult, NULL, NULL);
ASSERT(SUCCEEDED(hr));
pDocDisp->Release();
pDocument2->Release();
}

解决方案3:

JavaScript Calls from C++
http://www.codeguru.com/ieprogram/JSCalls.html


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

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

  • VC中如何调用Script中的函数?

相关文章

  • 2017-06-05 从linux移植到win32--无线安全利器--AirSnort-022,win32新版本发布
  • 2017-06-04 如何自己编写滚动条控件?
  • 2017-06-04 自己的ActiveX控件中有个函数是弹出一个对话框,但对话框就是显示不出来
  • 2017-06-05 主程序是用delphi做的,dll是用vc做的,在dll里面一个带有循环操作的函数如何更新主程序界面?
  • 2017-06-04 ATLActiveX控件应用于web的较深入的问题,请高手解决!!!
  • 2017-06-04 undefinedclass'ATL_NO_VTABLE'
  • 2017-06-04 关于Win32GDIDeleteObject函数删除HBRUSH后进程GDI句柄数不减的问题
  • 2017-06-04 为什么我没用头文件也可以使用CoInitialize在线等
  • 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
  • 微信公众号

最近更新的内容

    • word嵌入vc中,频繁打开和关闭word,报错误
    • 默认的散列-列集功能,是不是只能传递单个的参数,不能传递数组和指针?
    • 请问回调函数与线程间如何取舍?
    • VC60写了activex控件要打包在网页中运用?如何打包?
    • com的线程模式
    • 服务创建的EVNET对象,为什么在用户进程内打不可哪?
    • vc操作word表格?
    • 为什莫ActiveX的开发不能使用已有的ActiveX呢
    • 怎样使编译完成的动态连接库在资源管理器里显示图标
    • 怎样截取一个BSTR字符串中某一部分?tks

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

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