在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;
}
//---------------------------------------------------------------------------
前面三个功能都成功执行了,最后一个功能,也就是和窗口交互,不能执行,报错。提示“对象不支持此属性或方法”