版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
第一种:通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。
m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);
VARIANT ret;
ret.vt = VT_EMPTY;
BSTR bstr = sScript.AllocSysString();
bRet = m_pHtmlWindow->execScript(bstr, L"javascript", &ret);
::SysFreeString(bstr);
sRet = CString(ret);
第二种:先用GetIDsOfNames找到这个脚本函数名称,然后再调用。这种方法可以返回结果,有返回值。但是无法调用js的系统函数,如eval。
BOOL CDhtmlDlgWindow::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)
{
CComPtr spScript;
if (NULL==m_spHtmlDoc)
{
return FALSE;
}
HRESULT hr;
hr = m_spHtmlDoc->get_Script(&spScript);
if(!SUCCEEDED(hr))
{
return FALSE;
}
CComBSTR bstrMember(strFunc);
DISPID dispid = NULL;
hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr))
{
return FALSE;
}
const int arraySize = paramArray.GetSize();
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = arraySize;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
for( int i = 0; i < arraySize; i++)
{
CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // 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 = spScript->Invoke(dispid,IID_NULL,0,
DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
delete [] dispparams.rgvarg;
if(FAILED(hr))
{
return FALSE;
}
*pVarResult = vaResult;
return TRUE;
}
实际使用时,可能是先访问(Navigate)了一个页面。然后,在VC里面对这个页面进行一些js调用,并取回结果。有可能这个js调用的函数是这个页面里面没有的。一般可以用eval(一些js语句)这样的形式来调用页面里面没有的函数,但是,现在上面两种方法都不支持eval。
第三种:通过IScriptControl获取当前文档上下文,然后调用IScriptControl::raw_Eval运算。(只能用raw_Eval,用Eval方法会提示没有权限。)
首先定义一个:IScriptControlPtr,然后在OnDocumentComplete里面调用一下 m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);
IScriptControlPtr->AddObject("window", m_pHtmlWindow, VARIANT_TRUE);
第三种需要import "msscript.ocx"
分享到:
相关推荐
### VC调用JavaScript的几种方法 #### 一、引言 在软件开发过程中,经常需要在不同的编程语言之间进行交互。对于使用Visual C++(VC)进行开发的应用程序来说,有时候需要与网页中的JavaScript脚本进行通信。这种...
需要注意的是,VC调用JavaScript通常在Internet Explorer浏览器环境下,因为涉及到的COM接口和方法是IE特有的,不适用于其他类型的浏览器。此外,实际开发过程中可能还需要处理COM接口初始化失败、内存管理、异常...
(2)通过CWebPage类实现了VC调用javascript函数,并向函数传参。 (3)VC程序运行过程中用户可以在编辑框上输入经纬度坐标,点击按钮后地图跳转到坐标位置 (4)压缩包里含google map API中文参考手册,在javascript中用...
这个名为 "JS_CPP.rar" 的压缩包提供了一个实践案例,展示了如何在 JavaScript 和 VC (Visual C++) 之间实现互操作性。这些交互通常通过特定的接口或库来完成,以确保数据和控制流程能在两种语言之间无缝传递。 1. ...
在VC6中,我们可以创建一个新的ActiveX工程,然后定义一个或多个接口,这些接口可以被JavaScript代码调用。 1. **创建ActiveX控件**:在VC6中,选择“文件”->“新建”,然后在模板中选择“ActiveX 控件”。完成...
史上最详细的JS脚本调用VC自定义函数资料 看完准保不后悔 可以节省你很多时间的 实现原理: 利用BHO实现IDocHostUIHandler接口和IDispatch接口 通过BHO拦截网页加载完毕事件,将自己的IDocHostUIHandler接口设置给...
通过以上步骤,你可以在VC项目中成功地集成并调用CHM帮助文件,提供给用户一个完善的在线帮助系统。这个过程不仅可以节省开发时间,也能提高用户体验,因为CHM文件提供了丰富的格式化文本、图像和链接,使得帮助信息...
对于VC++调用JavaScript,我们可以利用两种主要方式:ATL(Active Template Library)结合IWebBrowser2接口,或者使用IDispatch接口加上IScriptControl接口。ATL+IWebBrowser2的方式,我们需要获取IWebBrowser2和...
在标题为“让VC程序调用网页脚本语言”的项目中,我们将探讨如何利用Microsoft Visual C++(VC)这一强大的C++集成开发环境,来与JavaScript和VBScript这两种常用的网页脚本语言进行交互。这主要涉及到Windows API、...
总结来说,"用vc调用html页面及交互"是一个涉及C++和HTML集成的实例,通过CHtmlView和ActiveX、JavaScript等技术,可以实现C++程序控制和接收HTML页面的反馈,从而扩展应用程序的功能。这种集成方式在现代软件开发中...
这通常涉及到在JavaScript中调用C++编写的函数,以利用C++的高性能和低级特性。本文将深入探讨如何实现这一目标,特别是在MFC(Microsoft Foundation Classes)框架下。 首先,理解基础原理:JavaScript是一种解释...
JavaScript中的View-Controller(VC)模式是一种常见的设计模式,它在Web开发中被广泛用于分离应用程序的业务逻辑、用户界面和数据管理。在这个记账页面的示例中,我们主要关注的是如何使用JavaScript来实现这一模式...
5. **调用JavaScript**:一旦有了执行环境,你可以通过调用`IHTMLDocument2::execScript`(MSHTML)或`JsRunTime::EvaluateScript`(ChakraCore)方法执行JavaScript。确保正确处理返回值和可能出现的错误。 6. **...
这样,我们可以在C++代码中调用JavaScript函数,或者监听JavaScript事件。例如,当用户点击地图上的某一点时,可以通过`WebBrowser`控件的`Document`对象来获取事件并处理。 在"GeoDemo"文件夹中的源码,应该包含了...
总结来说,使用VC6.0调用JSONCPP库需要正确集成源码、处理中文字符编码问题,并创建测试案例以验证功能。通过遵循上述步骤和提供的使用说明,你可以避免常见的问题,实现稳定可靠的JSON数据处理。记得在实际项目中,...
4. 显示地图:百度提供了JavaScript API用于在网页上显示地图,但在MFC应用中,你可能需要使用ActiveX控件或者直接使用百度地图的SDK。将地图控件添加到MFC界面,并通过API设置地图中心点、缩放级别等属性。 5. ...
2. **ActiveX Control Wrapper**:另一种方法是创建一个ActiveX Control Wrapper,它是一个中间层,可以将火狐的JavaScript命令转化为对OCX的调用。这通常涉及编写一个小型的.NET或COM组件,该组件能理解JavaScript...
标题中的“在网页中调用VC写的对话框”是一个关于Web与桌面应用交互的技术实践,主要涉及了ActiveX技术。ActiveX是微软在Internet Explorer浏览器中实现的一种组件对象模型(COM),它允许开发者创建可嵌入网页的...
这个压缩包“vc程序源代码 执行JavaScript文件中代码”提供了一个示例,它包含了一套C++源代码,能够运行JavaScript文件中的代码。这种技术通常被称为嵌入式脚本引擎。 C++是一种静态类型的、编译式的、通用的、大...