#12003/5/27 18:23:35
一个最简单而完整(可编译)的Script xtra源代码,仅一个CPP文件,没有实际功能,把主要的XDK宏展开了,对于C++和COM熟悉的朋友可以看出xtra的主要结构.
=====================================================
#define INITGUID
#include "moaxtra.h"
#include "mmixscrp.h"
#include "mmiutil.h"
#include "moatry.h"
DEFINE_GUID(CLSID_TStdXtra, 0x20d9f6d0, 0x9def, 0x4845, 0xa4, 0xbf, 0x5b, 0xf3, 0xfb, 0x75, 0xa7, 0xea);
//Xtra命名
#define XTRA_NAME "XMyXtra"
//版本
#define MAJOR_VERSION 1
#define MINOR_VERSION 0
#define FIX_VERSION 0
#define INITGUID
static char msgTable[] = {
"new object me\n"
"forget object me\n"
"-- "XTRA_NAME" --\n"
};
enum
{
m_new = 0,
m_forget,
m_XXXX
};
static char versionInfo[] = "xtra "XTRA_NAME" -- version %d.%d.%02d\n";
///////////////////////////////////////////////////
//EXTERN_BEGIN_DEFINE_CLASS_INSTANCE_VARS(TStdXtra)
struct TStdXtra;
typedef struct TStdXtra TStdXtra;
//EXTERN_STDMETHODIMP MOA_CREATE_PARMS(macro_CLASS);
EXTERN_C MoaError __stdcall MoaCreate_TStdXtra(TStdXtra FAR * This);
//EXTERN_STDMETHODIMP_(void) MOA_DESTROY_PARMS(macro_CLASS);
EXTERN_C void __stdcall MoaDestroy_TStdXtra(TStdXtra FAR * This);
struct TStdXtra : public IMoaUnknown
{
//_BASE_STRUCTURES
MoaXtraMagicCookie magicCookie;
PIMoaCallback pCallback;
PIMoaCalloc pCalloc;
ConstPMoaClassID pClassID;
MoaLong refCount;
//STDMETHOD(QueryInterface) (THIS_ ConstPMoaInterfaceID pInterfaceID, PPMoaVoid ppvObj);
MoaError __stdcall QueryInterface(ConstPMoaInterfaceID pInterfaceID, PPMoaVoid ppvObj);
//STDMETHOD_(MoaUlong, AddRef) (THIS);
MoaUlong __stdcall AddRef(void);
//STDMETHOD_(MoaUlong, Release) (THIS);
MoaUlong __stdcall Release(void);
///////////////////////////////////////////////////
//定义其他成员
//定义结束
///////////////////////////////////////////////////
//EXTERN_END_DEFINE_CLASS_INSTANCE_VARS
};
///////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//EXTERN_BEGIN_DEFINE_CLASS_INTERFACE(TStdXtra, IMoaMmXScript)
//struct INTF(TStdXtra, IMoaMmXScript); --> struct TStdXtra_IMoaMmXScript;
//typedef struct INTF(TStdXtra, IMoaMmXScript) INTF(TStdXtra, IMoaMmXScript); --> typedef struct TStdXtra_IMoaMmXScript TStdXtra_IMoaMmXScript;
//EXTERN_STDMETHODIMP INTFBUILD_PARMS(TStdXtra, IMoaMmXScript);
EXTERN_C MoaError __stdcall Build_TStdXtra_IMoaMmXScript(TStdXtra FAR * pObj, PPMoaVoid ppIF);
//struct INTF(TStdXtra, IMoaMmXScript) : public IMoaMmXScript
struct TStdXtra_IMoaMmXScript : public IMoaMmXScript
{
//_INTERFACE_STRUCTURES(TStdXtra)
TStdXtra FAR * pObj; /* pointer to the "real" object */ \
MoaLong refCount; /* refcount for THIS INTERFACE */
//STDMETHOD(QueryInterface) (THIS_ ConstPMoaInterfaceID pInterfaceID, PPMoaVoid ppvObj);
MoaError __stdcall QueryInterface(ConstPMoaInterfaceID pInterfaceID, PPMoaVoid ppvObj);
//STDMETHOD_(MoaUlong, AddRef) (THIS);
MoaUlong __stdcall AddRef(void);
//STDMETHOD_(MoaUlong, Release) (THIS);
MoaUlong __stdcall Release(void);
inline PMoaVoid operator new (size_t size, TStdXtra FAR * pObj)
{
//INTF(TStdXtra, IMoaMmXScript) FAR * p = (INTF(TStdXtra, IMoaMmXScript) FAR *)DLL(_MBNew)(size, pObj->pCalloc);
TStdXtra_IMoaMmXScript FAR * p = (TStdXtra_IMoaMmXScript FAR *)Dll_MBNew(size, pObj->pCalloc);
if (p)
{
p->pObj = pObj;
p->refCount = 1;
pObj->AddRef();
pObj->AddRef();
DLL(gXtraInterfaceCount)++;
}
return((PMoaVoid)p);
}
inline void operator delete (PMoaVoid ptr) { ptr; }
//EXTRA_MOA_DELETE(TStdXtra)
inline void operator delete (PMoaVoid ptr, TStdXtra FAR * pObj) { ptr; pObj; };
//INTF(TStdXtra, IMoaMmXScript) (MoaError FAR * pErr);
TStdXtra_IMoaMmXScript (MoaError FAR * pErr);
//~ INTF(TStdXtra, IMoaMmXScript) ();
~TStdXtra_IMoaMmXScript ();
//////////////////////////////////////////////////////////
///////////////////////////////////////////////////////
//EXTERN_DEFINE_METHOD(MoaError, Call, (PMoaDrCallInfo))
virtual MoaError __stdcall Call(PMoaDrCallInfo);
///////////////////////////////////////////////////////
private:
//////////////////////////////////////////////////
//EXTERN_END_DEFINE_CLASS_INTERFACE
};
//////////////////////////////////////////////////
EXTERN_BEGIN_DEFINE_CLASS_INTERFACE(TStdXtra, IMoaRegister)
EXTERN_DEFINE_METHOD( MoaError, Register, (THIS_ PIMoaCache pCache, PIMoaDict pDict))
EXTERN_END_DEFINE_CLASS_INTERFACE
//同上,只是IMoaScript改为IMoaRegister
///////////////////////////////////////////////////////
BEGIN_DEFINE_CLASS_INTERFACE(TStdXtra, IMoaMmXScript)
//对TStdXtra_IMoaMmXScript类中QueryInterface,AddRef,Release,new,delete操作符的实现,略
///////////////////////////////////////////////////////
END_DEFINE_CLASS_INTERFACE
//同上
BEGIN_DEFINE_CLASS_INTERFACE( TStdXtra, IMoaRegister)
END_DEFINE_CLASS_INTERFACE
MoaError __stdcall MoaCreate_TStdXtra (TStdXtra FAR * This)
{
moa_try
MessageBox(NULL,"Create OK","",MB_OK);
moa_catch
moa_catch_end
moa_try_end
}
void __stdcall MoaDestroy_TStdXtra(TStdXtra FAR * This)
{
moa_try
MessageBox(NULL,"Destroy OK","",MB_OK);
moa_catch
moa_catch_end
moa_try_end_void
}
TStdXtra_IMoaMmXScript::TStdXtra_IMoaMmXScript(MoaError FAR * pErr)
{
*pErr = kMoaErr_NoErr;
}
TStdXtra_IMoaMmXScript::~TStdXtra_IMoaMmXScript()
{
}
MoaError __stdcall TStdXtra_IMoaMmXScript::Call (PMoaDrCallInfo callPtr)
{
moa_try
switch ( callPtr->methodSelector )
{
case m_new:
{
MessageBox(NULL,"new OK","",MB_OK);
}
break;
case m_forget:
{
MessageBox(NULL,"forget OK","",MB_OK);
}
break;
}
moa_catch
moa_catch_end
moa_try_end
}
TStdXtra_IMoaRegister::TStdXtra_IMoaRegister( MoaError FAR * pErr)
{
*pErr = kMoaErr_NoErr;
}
TStdXtra_IMoaRegister::~TStdXtra_IMoaRegister()
{
}
MoaError __stdcall TStdXtra_IMoaRegister::Register(PIMoaCache pCache, PIMoaXtraEntryDict pXtraDict)
{
moa_try
PIMoaRegistryEntryDict pReg;
MoaBool bItsSafe = TRUE;
char versionStr[256];
PMoaVoid pMemStr = NULL;
ThrowErr(pCache->AddRegistryEntry(pXtraDict, &CLSID_TStdXtra, &IID_IMoaMmXScript, &pReg));
sprintf(versionStr, versionInfo, MAJOR_VERSION, MINOR_VERSION, FIX_VERSION);
pMemStr = pObj->pCalloc->NRAlloc(sizeof(msgTable) + sizeof(versionStr));
ThrowNull(pMemStr);
strcpy((char *)pMemStr, versionStr);
strcat((char *)pMemStr, msgTable);
ThrowErr(pReg->Put(kMoaDrDictType_MessageTable, pMemStr, 0, kMoaDrDictKey_MessageTable));
ThrowErr(pReg->Put(kMoaMmDictType_SafeForShockwave, &bItsSafe, sizeof(bItsSafe), kMoaMmDictKey_SafeForShockwave));
moa_catch
moa_catch_end
if (pMemStr)
pObj->pCalloc->NRFree(pMemStr);
moa_try_end
}
///////////////////////////////////////////////////////////////////
BEGIN_XTRA
BEGIN_XTRA_DEFINES_CLASS(TStdXtra, 1)
//CLASS_DEFINES_INTERFACE(TStdXtra, IMoaRegister, 1)
{
err = (*eciProc)(pCurClassID, curClassVersion, &IID(IMoaRegister), 1, (XtraBuildInterfaceProc)Build_TStdXtra_IMoaRegister, refCon);
if (err) break;
}
CLASS_DEFINES_INTERFACE(TStdXtra, IMoaMmXScript, 1)
END_XTRA_DEFINES_CLASS
END_XTRA
///////////////////////////////////////////////////////////////////