脚本错误缺少对象:如何使当前程序的对象进入脚本

例如写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调用的类和对象

  1. //声明可以被JavaScript调用的类并创建一个转接对象g_Dialogimpl
  2. BEGIN_DSRE_POPULAR_OBJECT(CCppCallJavaScriptDlg)
  3. DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,Rectangle);
  4. DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,MoveTo);
  5. DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,LineTo);
  6. DEFINE_POPULAR_METHOD(CCppCallJavaScriptDlg,TextOut);
  7. END_DSRE_POPULAR_OBJECT()g_Dialogimpl;
  1. //定义可以被JavaScript调用的函数,分别是Rectangle,MoveTo,LineTo,TextOut
  2. DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,Rectangle)
  3. {
  4. intx,y,cx,cy;
  5. x=(*args)[0]->AsInt();
  6. y=(*args)[1]->AsInt();
  7. cx=(*args)[2]->AsInt();
  8. cy=(*args)[3]->AsInt();

  9. ::Rectangle(m_hDC,x,y,cx,cy);
  10. }

  11. DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,MoveTo)
  12. {
  13. intx,y;
  14. x=(*args)[0]->AsInt();
  15. y=(*args)[1]->AsInt();

  16. ::MoveToEx(m_hDC,x,y,NULL);
  17. }

  18. DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,LineTo)
  19. {
  20. intx,y;
  21. x=(*args)[0]->AsInt();
  22. y=(*args)[1]->AsInt();

  23. ::LineTo(m_hDC,x,y);
  24. }

  25. DEFINE_DSRE_FUNCTION(CCppCallJavaScriptDlg,TextOut)
  26. {
  27. intx,y;
  28. x=(*args)[0]->AsInt();
  29. y=(*args)[1]->AsInt();
  30. wchar_t*text=(*args)[2]->AsString()->GetText();
  31. ::TextOutW(m_hDC,x,y,text,(*args)[2]->AsString()->GetLength());
  32. }
2 向msscript.ocx添加代码

  1. code_w=L"functionOnDialogPaint(dialog){dialog.Rectangle(20,20,220,220);dialog.MoveTo(270,20);dialog.LineTo(300,120);dialog.TextOut(280,150,\"TextfromJavaScript\");}";
  2. code=code_w.GetText();
  3. JScriptWrapper->Invoke(NULL,L"AddCode",&code,&ret);
3 在VC的 _disibledevent="472" />


为真正的双向调用。

后记:

如果有了双向调用技术,不难想象Flash的ActionScript的实现方法,也不难想象Maxthon的Plug-in可以用MS Script来做。如果不能实现双向,只能像WPS那样,Script只能作为Add-on,而不是Plug-in(没有贬低WPS之意)。

Tags:  当前页脚本发生错误 当前脚本发生错误 脚本对象 脚本错误缺少对象

延伸阅读

最新评论

发表评论