在C++buillder6中调用CnActiveScript组件出错.delphi7没问题,例子ActiveScript_D7正常,可以运行,几个功能都没问题.我在C++builder6中,仿delphi7代码时,前面三个功能正常,最后一个创建类,就不能调用.
#include "CnActiveScript.hpp"
#include "CnASIDispatchProxy.hpp"
#include <TypInfo.hpp>
#include <typeinfo>
//组件实例已创建
TCnActiveScriptWindow *pScript = new TCnActiveScriptWindow(this);
//声明接口
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:
ueryInterface(riid, (void*)ppvObject); };
virtual ULONG STDMETHODCALLTYPE AddRef( void)
{ return TInterfacedObject::_AddRef(); };
virtual ULONG STDMETHODCALLTYPE Release( void)
{ return TInterfacedObject::_Release(); };
};
void __fastcall TForm1::Button4Click(TObject *Sender)
{
_di_IDispatch Intf;
const type_info &t0 = typeid(ITest);
TTest * p = new TTest();
Typinfo::TTypeInfo * pInfo = new Typinfo::TTypeInfo;
pInfo->Kind = Typinfo::tkInterface;
pInfo->Name = t0.name();
Intf = GetIDispatchProxy(p, pInfo);//此句出错
pScript->Clear();
pScript->ScriptLanguage = "VBScript";
pScript->AddNamedItem("a", Intf);
pScript->Execute("a.MsgBox()");
pScript->Clear(); // ITest released
}
上述代编译没问题,运行时地址溢出了.跟踪后是CnASInvoker.pas文件中第352行出错.请教高手.