博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC调用 JavaScript 难题:如何使当前程序的对象进入脚本
阅读量:2399 次
发布时间:2019-05-10

本文共 2770 字,大约阅读时间需要 9 分钟。

导读:
  本文所指的 JavaScript 为 MS Script,引入msscript.ocx 实现的,也就是ECMAScript(下载本例源代码)。从题目咋眼看来对于没有写过VC调用msscript.ocx的人来说不是很好理解,因为这样做似乎太容易了,何来难题?
  例如写JavaScript实 现数值计算,例如: _variant_t outpar=pScriptControl->Eval(_bstr_t("1+4*5")); 这样的数值计算不涉及js调用脚本外部的对象,例子到处可见,但是应用范围非常窄小。也就是说,从现有的文献来看,用VC调用 JavaScript 都是 JavaScript 单向的,但是从来没见过把VC中的现有的对象交给 JavaScript 反过来调用(也就是双向调用)。有些人已经实现或者看到, JavaScript 可以通过 obj = new ActiveXObject(...);的方式,把用VC编写COM,然后让 JavaScript 创建调用,但是,这样new出来的对象,仍然不是VC应用的现有对象。如果要调用现有对象,需要通过被new的COM对象间接调用才行,而且应用程序被调 用的对象也是COM规范。如果通过COM来实现这个难题,应用程序结构比较复杂,JavaScript 创建COM,所创建的COM能访问应用程序对象。
  所以要扩大 JavaScript 的应用范围,必须实现这样的核心问题:双向调用。
  双向调用的一个分解问题是,VC对象如何进入脚本呢?下面介绍一种实现方法。
  一、界面:
  
  
  
  二、主要代码
  1 声明定义可以被JavaScript调用的类和对象
  //声明可以被JavaScript调用的类并创建一个转接对象g_Dialogimpl
  BEGIN_DSRE_POPULAR_OBJECT(CCppCallJavaScriptDlg)
  DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,Rectangle);
  DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,MoveTo);
  DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,LineTo);
  DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,TextOut);
  END_DSRE_POPULAR_OBJECT()g_Dialogimpl;
  //定义可以被JavaScript调用的函数,分别是Rectangle, MoveTo, LineTo, TextOut
  
  
  DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,Rectangle)
  
  
  
  
  
  {
  
  
  int x,y,cx,cy;
  
  
  x=(*args)[0]->AsInt();
  
  
  y=(*args)[1]->AsInt();
  
  
  cx=(*args)[2]->AsInt();
  
  
  cy=(*args)[3]->AsInt();
  
  
  
  
  ::Rectangle(m_hDC,x,y,cx,cy);
  
  
  }
  
  
  
  DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,MoveTo)
  
  
  
  
  
  {
  
  
  int x,y;
  
  
  x=(*args)[0]->AsInt();
  
  
  y=(*args)[1]->AsInt();
  
  
  
  
  ::MoveToEx(m_hDC,x,y,NULL);
  
  
  }
  
  
  
  DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,LineTo)
  
  
  
  
  
  {
  
  
  int x,y;
  
  
  x=(*args)[0]->AsInt();
  
  
  y=(*args)[1]->AsInt();
  
  
  
  
  ::LineTo(m_hDC,x,y);
  
  
  }
  
  
  
  DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,TextOut)
  
  
  
  
  
  {
  
  
  int x,y;
  
  
  x=(*args)[0]->AsInt();
  
  
  y=(*args)[1]->AsInt();
  
  
  wchar_t *text=(*args)[2]->AsString()->GetText();
  
  
  ::TextOutW(m_hDC,x,y,text,(*args)[2]->AsString()->GetLength());
  
  
  }
  2 向msscript.ocx添加代码
  
  code_w=L"function OnDialogPaint(dialog){dialog.Rectangle(20,20,220,220);dialog.MoveTo(270,20);dialog.LineTo(300,120);dialog.TextOut(280,150,/"Text from JavaScript/");}" code=code_w.GetText();
  JScriptWrapper->Invoke(NULL,L"AddCode",&code,&ret);
  
  3 在VC的 OnPaint 事件调用 JavaScript
  LWideString code_w=L"OnDialogPaint(theCppDialog);" code=code_w.GetText();
  JScriptWrapper->Invoke(NULL,L"Eval",&code,&ret);
  
  这样就完成了一下调用过程:
  
  
  
  为真正的双向调用。
  后记:
  如果有了双向调用技术,不难想象Flash的ActionScript的实现方法,也不难想象Maxthon的Plug-in可以用MS Script来做。如果不能实现双向,只能像WPS那样,Script只能作为Add-on,而不是Plug-in(没有贬低WPS之意)。
本文转自
你可能感兴趣的文章
第十七章 控制工作概述
查看>>
佳句与老友一起分享
查看>>
解读BPM风潮:缘何受到企业青睐?(转载)
查看>>
成功经理人与自我管理能力(转载)
查看>>
ERP系统应用与管理咨询(转载)
查看>>
精益思想—人、过程和技术的集成(zt)
查看>>
超市食品名称中英文对照(zt)
查看>>
第六章 预测与决策
查看>>
14大管理方法工具(zt)
查看>>
职业生涯规划与管理实操(zt)
查看>>
国贸、货代常用词汇(zt)
查看>>
人力资源术语英汉对照(zt)
查看>>
传说中的100句英语可以帮你背7000单词(zt)
查看>>
网管IT服务管理五个心得 (zt)
查看>>
沟通管理 让你的团队动起来(zt)
查看>>
循序渐进学SAP系列(一):--SAP该如何入门
查看>>
PMP考试经验谈(转载)
查看>>
緣分是找到包容你的人(转载)
查看>>
关注人力资源管理的十大变化(转)
查看>>
知识管理与业务流程重组(转载)
查看>>