C++builder调用CnActiveScript脚本组件

在cnPack中找到CnActiveScript的源码,在C++builder中调用,将几个相关的pas文件加入到工程中,编译后生成obj文件,请将obj添加到工程管理中去(或用文中头文件的方式也可)。

//创建一个窗口工程,窗口头文件
//---------------------------------------------------------------------------
#ifndef mainUnitH
#define mainUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#pragma link "obj\\CnActiveScript.obj"
#pragma link "obj\\CnClasses.obj"
#pragma link "obj\\CnCompConsts.obj"
#pragma link "obj\\CnConsts.obj"
#pragma link "obj\\CnNativeDecl.obj"
#pragma link "obj\\CnASInvoker.obj"
#pragma link "obj\\CnASIDispatchProxy.obj"
#include "CnActiveScript.hpp"
#include "CnASIDispatchProxy.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TMemo *Memo1;
        TButton *Button1;
        TLabel *Label1;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
private:	// User declarations
        TCnActiveScriptWindow * pScript;
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
        void __fastcall OnScriptError(TObject *Sender, int Line,
  int Pos,AnsiString ASrc,AnsiString ADescription);
        void showinfo();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

这是窗口的cpp文件

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "mainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{//创建组件
   pScript = new TCnActiveScriptWindow(this);
   pScript->CleanBeforeRun = false;
   pScript->OnError = OnScriptError;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{//执行多行脚本
    pScript->Clear();
    pScript->CleanBeforeRun = false;
    pScript->ScriptLanguage = "VBScript";
    pScript->Execute(Memo1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnScriptError(TObject *Sender, int Line,
  int Pos,AnsiString ASrc,AnsiString ADescription)
{//错误捕获
  ShowMessage(AnsiString("Error Line:")+ Line +"\n Pos:"+ Pos+
    "\n Src:"+ASrc + "\n Description:"+ ADescription);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{//计算表达式
  OleVariant Value;
  pScript->ScriptLanguage = "VBScript";
  Value = pScript->RunExpression(Memo1->Text);
  if (!VarIsNull( Value.VByte ) )
  {
    AnsiString str = AnsiString(Value.VByte);
    ShowMessage(str);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{//执行一个函数,并获取返回值
  WideString s;
  OleVariant v;

  pScript->Clear();
  pScript->CleanBeforeRun = False;  // Must be False
  pScript->ScriptLanguage = "VBScript";
  s = // 声明函数
    AnsiString("Function TestFunc() ") +
    "  TestFunc = 6+2 " +
    " End Function " ;
  pScript->Execute(s);
  s = "Func";  //调用函数
  v = pScript->RunExpression("TestFunc");
  AnsiString str = AnsiString(v.VByte);
  ShowMessage(str);
}
//================================================================
//和宿主窗口交互,这里比较复杂
//声明接口
interface ITest : public IActiveScriptInvokable
{
  public:
    virtual void __stdcall MsgBox(AnsiString Text) =0;
    virtual void __stdcall SetAppTitle(AnsiString Text)=0;
    virtual int  __stdcall Add(int A,int B)=0;
};
typedef DelphiInterface<ITest> _di_ITest;
//实现接口类
class TTest :public  TInterfacedObject,public ITest
{
  public:

    void __stdcall MsgBox(AnsiString Text)
    {
       ShowMessage(Text);
    };
    void __stdcall SetAppTitle(AnsiString Text)
    {
       Application->Title = Text;
    };
    int __stdcall Add(int A, int B){return A+B;};

    //---------------------------------------------
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject)
    { return TInterfacedObject::QueryInterface(riid, ppvObject); };
 
    virtual ULONG STDMETHODCALLTYPE AddRef( void)
    { return TInterfacedObject::_AddRef(); };
 
    virtual ULONG STDMETHODCALLTYPE Release( void)
    { return TInterfacedObject::_Release(); };

};
#include <TypInfo.hpp>
#include <typeinfo>
using namespace std;
void __fastcall TForm1::Button4Click(TObject *Sender)
{//执行窗口交互
  _di_IDispatch  Intf;

  TTest * p = new TTest();

  const type_info &t0 = typeid(ITest);

  Typinfo::TTypeInfo * info = new TTypeInfo;
  info->Kind = Typinfo::tkInterface;
  info->Name = t0.name();

  Intf = GetIDispatchProxy(p, info);

  pScript->Clear();
  pScript->ScriptLanguage = "VBScript";
  pScript->AddNamedItem("Test", Intf);
  pScript->Execute("Test.MsgBox(\"Test\")");
  pScript->Clear(); // ITest released

  delete info;
}
//---------------------------------------------------------------------------

前面三个功能都成功执行了,最后一个功能,也就是和窗口交互,不能执行,报错。提示“对象不支持此属性或方法”

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值