主题:  想开发Xtra?给大家做了点工作:对XDK宏的展开

滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#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
///////////////////////////////////////////////////////////////////



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#22003/5/27 18:25:58

相关文件:点这儿打开
上传完整工程,可以正常编译,当然这个xtra什么也不做,只弹出对话框。

要正确编译此工程,你需要VC 6。
如果要开发xtra,你需要XDK(可以在MM网站下载)。
工程中带了XDK的一部分。
本工程供C++程序员参考,懂COM原理就可以了,我把XDK中烦人的宏展开了。



5D荣誉斑竹

职务:普通成员
等级:3
金币:10.0
发贴:954
#32003/5/27 20:14:57
用c可以编写吗??
(题外话:刚才看了你的书房的照片,我发誓,这绝对是我看到的最最称得上书房的地方了,呵呵,简直是书的世界,书的海洋了)


真正的光明绝不是永没有黑暗的时间,只是永不被黑暗所湮没罢了;真正的英雄绝不是永没有卑下的情操,只是永不被卑下的情操所屈服罢了。

滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#42003/5/27 20:42:50
C应该可以的,但有些宏可能会有变化,因为有编译器预处理指令判断是C还是C++
我这个是C++的.



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#52003/5/27 20:53:36
我买的书大概看了5%



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#62003/5/28 11:46:44
看来开发xtra的人太少啦,我没有几个竞争对手,哈哈.



5D荣誉斑竹

职务:普通成员
等级:3
金币:10.0
发贴:954
#72003/5/28 11:51:40

现在国内开发xtra的,比较有名的除了老张的磨鉴室就是你滨滨的“ ”工作室了!呵呵!
还有,我有个兄弟要徐进也在开发这个!
xujinmax是他的网名!

编辑历史:[这消息被虚竹编辑过(编辑时间2003-05-28 11:51:53)]

真正的光明绝不是永没有黑暗的时间,只是永不被黑暗所湮没罢了;真正的英雄绝不是永没有卑下的情操,只是永不被卑下的情操所屈服罢了。

滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#82003/5/28 14:24:59
徐进我知道啊,QQ上常聊的 ;)
不过他们主要开发U32,我现在主要开发X32,AW/DR通用,呵呵.



xdsnet

职务:普通成员
等级:1
金币:1.0
发贴:167
#92003/5/28 15:09:28
好久没有消息了,大家还好吧!



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#102003/5/28 16:45:06
还算好吧. ;) ;) ;)



牟瓜

职务:普通成员
等级:1
金币:0.0
发贴:2
#112003/6/6 10:47:03
不错,就是我还没看十分明白。c++不太懂。



hitdemo2002

职务:普通成员
等级:1
金币:0.0
发贴:3
#122003/6/7 13:33:24
用delphi可不可以开发???????????



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
#132003/6/7 18:14:53
可以,不过你需要一套SDK,很贵,几百美金.



donghaiyang

职务:普通成员
等级:1
金币:0.0
发贴:5
#142003/6/8 0:11:04
我想问一下,一些电脑的驱动光盘是用多媒体软件做的吗?



huat

职务:普通成员
等级:1
金币:0.0
发贴:58
#152003/6/15 10:37:45
有的是用AW做的,有的不是。