Skip to content

mudchina/fy3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

		Mudos V22pre11 for WIN95/NT with COM extension Version 1.1
				Copyright (C) 1998,1999 
				      wwj,kcn
		
第一节 系统简介及部分改正的错误

第二节 LPC上的增强

第三节 LPC和COM extension混合编程

附录一 Mudos v22pre11 with COM extension中的COM对象


--------------------------------------------------------------------------------


第一节 系统简介及部分改正的错误


    Mudos V22pre11 for WIN95/NT with COM extension ( 以下简称
pre11 with COM)由清华大学计算机系王文军,周霖在Mudos V22pre11的基
础上开发而成。比较原版本的Mudos V22pre11来说,这个版本的Mudos改正
了一些错误,增加了对COM对象的支持。
    COM( Component Object Model )是Microsoft公司提出的一个开放
的面向对象技术。在Mudos中加入COM的支持,主要是为了能运用一些已有的
成熟技术和资源,弥补Mudos本身的功能不足。关于COM的具体说明请参看OLE
编程的资料。
    
    Mudos V22pre11已经改正了V21版中的不少错误,pre11 with COM则在这
个基础上又有大量的改动,应该说是一个很成熟的版本(已经在清华计算机系
楼内MUD上运行有半年多的时间)。以下是改动情况:
    
系统部分:
1. 修改 random 函数使之返回32位值,而不是WIN32平台中的16位
2. 修改了部分占用CPU时间过多的情况
3. 修改了 locatime 中的错误,使它不会在一天内循环
4. 修改lex.c 使编译时认识 8 进制数
5. 修改了 debug_error 函数,使它能报告 socket 错误
6. 增加了 set_this_player() efun
7. 增加了 rusage() efun,返回值如下:
   NT:
        int   ver     WINAPI GetVersion()的返回值
	int   utime   MUDOS用户态时间,单位:msec
	int   stime   MUDOS核心态时间
	int   load1   过去一分钟MUDOS占用机器时间的比率,
	 	      例:57% -> 5000 , 57.42% -> 5742
	int   load10  过去十分钟MUDOS占用机器时间的比率
	int   load15  过去十五分钟MUDOS占用机器时间的比率
   95/98:
        int   ver     WINAPI GetVersion()的返回值
	int   utime   机器运行时间,单位:msec
	int   stime   0
	int   load1   过去一分钟CPU利用率
	int   load10  过去十分钟CPU利用率
	int   load15  过去十五分钟CPU利用率
8. 修改了get_dir,使返回文件名为小写
9. 增加了配置界面。不再需要配置文件mudos.ini,配置改到registry
   HKEY_LOCAL_MACHINE\\wwj\\MudOS下
10.NT/95下支持多个MudOS Service实例,只要你的mudos.exe放在不同的
   目录下,或者exe文件名不同。
11.同时支持中文,英文NT/95。不会出现在英文操作系统下配置出乱码的
   情况。
12.允许>64人的登录。(上限1024,不过我想连接还没到那么多的
   时候MUDOS就当了)

COM部分:
1. 改进了LPC中COM class的定义,具体见后面的说明。
2. 修改了MString对象中的错误,使之不会有内存泄露的情况。
3. COM成员函数可以返回array,mapping,class等复杂类型。

	当你拿到Mudos v22pre11 for WIN95/NT with COM extension Version 1.1时,
它是一个zip文件,请用winzip展开,里面包含有执行文件与源码,在使用、分发、
修改它们时,请遵照GPL协议进行。
	Mudos.exe       编译好的执行文件,使用前先杀毒,防止传输中感染病毒
	                (不过在我这还是没有毒的)。
	                
	Readme.txt      是这个说明文档
	
	GPL.txt         GNU GENERAL PUBLIC LICENSE
	
	Mudos\*.*       MudOS的源码,用VC6.0编译通过
	
	BBS\lpc\*.*     一个LPC版本的BBS,没有写完,如果有谁愿意和我续写,请给
			wwj@www.telekbird.com.cn去信。
					
	BBS\bbscom\*.*  运行LPC版本BBS时一个必要模块的源码。
	
        BBS\FB270\*.*   Firebird BBS 2.70的源码
    
        testmud\*.*     一个测试连线的程序
    
        xyj\*.*         一个用于测试mudos的MUD《西游记》
    
    当你要启动mudos.exe时,请直接运行mudos.exe。它会弹出一个对话框让你输入
config文件位置,address server的端口,以及heart_beat时间。把它设成service
使得下次启动计算机时mud能自动运行,请在该对话框上点“注册服务”。当你配置
完了后,mudos就正式启动了。

    运行时会在explorer的那个状态条的右端加上一个"小地球"的ICON,以此表明它
正在运行。用鼠标点击它,会出现一个菜单,可以选择  About,Setup,Restart或
Shutdown。选Setup就会出现前面的那个配置对话框。

    当你在运行这个版本的mudos发现有什么问题时,请与下面的地址联系,我们会
尽量给你解答的。


    wwj    wwj@telekbird.com.cn
    kcn    mudos@126.com

 

--------------------------------------------------------------------------------


第二节 LPC上的增强



        Mudos v22pre11 with COM extension version 1.1 版本相比原V21版而言,LPC中
新增了class类型,新增了一些efunc,以下一一说明。

class类型类似于C中class,LPC的句法如下:

class class_name {
    type member_name1;
    type member_name2;
    ...
    
    type member_func(type var...);
};

声明一个class对象时句法是

	class class_name object_name;

使用对象之前应该先对对象初始化:
    
	object_name = new ( class class_name );

在引用class对象的成员时应该使用 -> 符号。

	object_name -> member_name1 = 0;

以下是一个LPC例子:

class ab
{
	int a;
	int add();
}

int ab::add() // ab的成员函数 add()
{
	return a++; // ab的成员变量 a++
}

class ab b;

useab()
{
	b=new(class ab);
	b->a=0; // b->a is 0
	b->add(); // then b->a is 1
}

	由于成员函数的出现,有必要支持在成员函数中访问本class,因此增加了
一个this关键字,用它来指示当前的class变量。如int ab::add()就可以写成
int ab::add()
{
	return this->a++;
}
	当然this主要的作用是将class自己传给别的函数。

	如果要定义COM对象,应该使用以下格式:
class class_name {
	member and member function ...
} = " com ";

	com是你要引用的com对象的CLSID或者ProgID或者DLL在MUD中的全路径,比如
Microsoft IE的HTML Viewer控件的CLSID是
        {EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}
ProgID是 
        Microsoft Web Browser Control
        
	class_name是你所使用的Interface的名字,如HTML Viewer控件的一个接口是 
IWebBrowser。
	class 的member和member function都应该是这个接口的属性和方法。通过
VC中带的OLE/COM Viewer可以看到Microsoft Web Browser Control的IWebBrowser
的定义是这样的(部分)。。。

[
	uuid(EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B), // 这就是那个CLSID
	helpstring("Web Browser interface"), 
	hidden,
	dual
]

dispinterface IWebBrowser {
methods:

[id(0xfffffdda), helpstring("Refresh the currently viewed page.")]
void Refresh(); // 一个方法 

[id(0x00000068), helpstring("Navigates to a URL or file.")]
void Navigate( // 另一个方法 
[in] BSTR URL, 
[in] VARIANT* Flags, 
[in] VARIANT* TargetFrameName, 
[in] VARIANT* PostData, 
[in] VARIANT* Headers);

[id(0x000000ce), propget, helpstring("The horizontal position (pixels) of the frame window relative to the screen/container.")]
long Left(); 
    // 虽然写在methods里,但由于progget属性,实际上还是认为是属性,
    // 这是读属性值的方法

[id(0x000000ce), propput, helpstring("The horizontal position (pixels) of the frame window relative to the screen/container.")]
void Left([in] long rhs); 
    // 虽然写在methods里,但由于progput属性,实际上还是认为是属性,
    // 这是写属性值的方法

    // 等等。。。
}

变成LPC中可引用的class就该定义成:

class IWebBrowser {
	void Refresh();
	int Left;
} = "{EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B}"; 
这个字符串可以另写为 Microsoft Web Browser Control
    
考察上面这个定义,与标准的C++对象定义没什么大的差别。成员Refresh
方法基本上于MIDL的定义没什么变化,Left属性的类型变成了int,Navigate
方法没加进来,这是因为在LPC与COM间类型转换时不是所有类型的参数都可以用
的。

目前的pre11 with COM extension支持以下类型转换:

	LPC中 int     与   COM中 int,long 互相转换。
	LPC中 string  与   COM中 BSTR     互相转换。
	LPC中 float   与   COM中 float    互相转换。
	LPC中 void    与   COM中 void     互相转换。
	LPC中 array   转成 COM中 IMValue * 。
	LPC中 class   转成 COM中 IMValue * 。
	LPC中 object  转成 COM中 IMValue * 。
	LPC中 mapping 转成 COM中 IMValue * 。

IMValue 接口在Mudos.exe中有定义。这里"互相转换"的意思是支持该类型作为
参数可以传递,也可以作为返回值,如属性的类型。对于无法转化的方法或属
性,不要写在class的定义中。

使用COM定义的class和普通的class相同,给出使用上面IWebBrowser的例子:

int UseIt()
{
	class IWebBrowser web;
	web=new (class IWebBrowser);
	web.Left=10;
	web.Refresh();
}

这里用IWebBrowser做例子的目的是说明如何使用COM对象,事实上IWebBrowser
不能在Mudos上使用(Mudos是一个telnet服务器,用不着一个浏览器)。下面是
另一个例子:

class IBbs {         // 必须是一个接口名,大小写敏感
    class IBbs QueryInterface(string);
    int  GetPlayerID(object);
    void SetEcho(int,int);
    void EnableKey(int,int);
    int  ThisPlayer();
}="/bin/obj/bbscom.dll";   // 也可以是 "{xxxx-xx...}" coclass GUID
   这里的"/bin/obj/bbscom.dll"是你的COM对象所在的DLL或OCX。用这
个定义方法不用在配置中加上com=...的说明(见原pre11 with COM extension
说明),不用预先注册,限制是必须用全路径。

   QueryInterface是一个预定义的类成员函数,当你的类还有别的接口
的时候,你可以用这个函数来取得同一实例的另一接口(去掉了原来的
AssignInstance函数)。例:
class IBbs2 {
    int Test();
}="/bin/obj/bbscom.dll";
   你可以用以下的LPC代码
   IBbs  bbs;
   IBbs2 p;
   bbs=new(class IBbs);
   p=bbs->QueryInterface("IBbs2");
   则p是bbs所指定COM实例的另一个接口。


--------------------------------------------------------------------------------

第三节 LPC和COM extension混合编程


pre11 with COM extension本身提供了几个COM对象用于与外面的程序通讯,
具体定义请看附录一,在以后的说明中我将会提到 IMudos,IMValue,IMNumber,
IMString,IMReal,IMClass,IMObject,IMArray,IMMapping,IMProgram,
IMFunction这几个接口。

	首先你得建立一个ATL com dll的工程,然后新增加一个ATL Class。当你把
这个class取名为CTest时,你所得到的接口(Interface)名就成了ITest。然后你
就可以往这个Interface中添加属性和方法。

注意你所添加的属性类型只能是(不能有多余参数)
    int,BSTR,float
你所添加的方法返回类型只能是
    int,BSTR,float,IDispatch *
参数类型只能是
    int,BSTR,float,IDispatch *
对int,BSTR,float的处理和一般的COM一致。对IDispatch *的处理应该将它
传给IMValue对象,然后根据IMValue的Type()来GetExtend()取得相应类型的对象。
比如LPC中定义的class成员函数

	int Test(int i,class CTest c);

	对应的COM对象成员函数就该是:
	
MIDL interface:
	HRESULT Test([in] int i,[in] IDispatch *p,[out,retval] int *pVal);

MIDL dispinterface:
	int Test([in] int i,[in] IDispatch *p);
	
C++:
	STDMETHOD(Test)(int i,IDispatch *p,int *pVal);
	
	在Test中的实现时应该是这样的:

STDMETHODIMP CTest::Test(int i,IDispatch *p,int *pVal)
{
	// 这些接口的函数请查看生成的mudos.h
	if(!pVal)return S_FALSE;
	IMValue v(p);
	if(v.GetType()!=VP_CLASS)return S_FALSE; 
	IMClass c(v.GetExtend());

	// now use i,c
	// ...
	// return val in pVal
	return S_OK;
}

	你的对象可以声明两个方法作为事件响应:
MIDL interface: 
	HRESULT OnNewObject(IDispatch *p);
	HRESULT OnFreeObject();
	
在C++中的实现是:
	STDMETHODIMP CTest::OnNewObject(IDispatch *p)
	{
		m_os=new IMudos(p); // m_os是CTest的一个类型为IMudos *的成员变量
		return S_OK;
	}
	
	STDMETHODIMP CTest::OnFreeObject()
	{
		delete m_os;
		return S_OK;
	}
	这样在COM中就能使用IMudos的所有功能。
	
	具体实例请参看附带的BBSCOM和LPC BBS


--------------------------------------------------------------------------------


附录一 Mudos v22pre11 with COM extension中的COM对象


mudos.idl文件
// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: MUDOS.DLL
// Forward declare all types defined in this typelib
interface IMValue;
interface IMNumber;
interface IMString;
interface IMReal;
interface IMObject;
interface IMClass;
interface IMMapping;
interface IMArray;
interface IMBuffer;
interface IMProgram;
interface IMFunction;
interface IMudos;

[
uuid(F64617C2-EA5A-11D1-B962-0080AD1480B3),
version(1.0),
helpstring("mudos v22pre11 Type Library")
]
library MUDOSLib
{
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("STDOLE2.TLB");

[
uuid(1B6ED8C0-EB38-11D1-BF0B-0000B4560A15),
helpstring("MValue Class")
]
coclass MValue {
[default] interface IMValue;
interface IMNumber;
interface IMString;
interface IMReal;
interface IMObject;
interface IMClass;
interface IMMapping;
interface IMArray;
interface IMBuffer;
};

[
odl,
uuid(1B6ED7C8-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMValue Interface"),
dual,
oleautomation
]
interface IMValue : IDispatch {
[id(0x00000051), propget, helpstring("property Name")]
HRESULT _stdcall Name([out, retval] BSTR* pVal);
[id(0x00000052), propget, helpstring("property Type")]
HRESULT _stdcall Type([out, retval] eVALUETYPE* pVal);
[id(0x00000053), helpstring("method CreateNumber")]
HRESULT _stdcall CreateNumber();
[id(0x00000054), helpstring("method CreateString")]
HRESULT _stdcall CreateString();
[id(0x00000055), helpstring("method CreateReal")]
HRESULT _stdcall CreateReal();
[id(0x00000056), helpstring("method CreateArray")]
HRESULT _stdcall CreateArray([in] int size);
[id(0x00000057), helpstring("method CreateMapping")]
HRESULT _stdcall CreateMapping();
[id(0x00000058), propget, helpstring("property Extend")]
HRESULT _stdcall Extend([out, retval] IDispatch** pVal);
};

typedef enum {
VP_UNKNOW = 0,
VP_NUMBER = 1,
VP_STRING = 2,
VP_REAL = 3,
VP_OBJECT = 4,
VP_ARRAY = 5,
VP_MAPPING = 6,
VP_CLASS = 7,
VP_BUFFER = 8,
VP_FUNCTION = 9
} eVALUETYPE;

[
odl,
uuid(1B6ED7C0-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMNumber Interface"),
dual,
oleautomation
]
interface IMNumber : IDispatch {
[id(0x00000001), propget, helpstring("property Number")]
HRESULT _stdcall Number([out, retval] int* pVal);
[id(0x00000001), propput, helpstring("property Number")]
HRESULT _stdcall Number([in] int pVal);
};

[
odl,
uuid(1B6ED7C1-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMString Interface"),
dual,
oleautomation
]
interface IMString : IDispatch {
[id(0x0000000b), propget, helpstring("property String")]
HRESULT _stdcall String([out, retval] BSTR* pVal);
[id(0x0000000b), propput, helpstring("property String")]
HRESULT _stdcall String([in] BSTR pVal);
};

[
odl,
uuid(1B6ED7C2-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMReal Interface"),
dual,
oleautomation
]
interface IMReal : IDispatch {
[id(0x00000015), propget, helpstring("property Real")]
HRESULT _stdcall Real([out, retval] single* pVal);
[id(0x00000015), propput, helpstring("property Real")]
HRESULT _stdcall Real([in] single pVal);
};

[
odl,
uuid(1B6ED7C3-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMObject Interface"),
dual,
oleautomation
]
interface IMObject : IDispatch {
[id(0x0000001f), propget, helpstring("property ObjectName")]
HRESULT _stdcall ObjectName([out, retval] BSTR* pVal);
[id(0x00000020), propget, helpstring("property ObjectLoadTime")]
HRESULT _stdcall ObjectLoadTime([out, retval] int* pVal);
[id(0x00000021), propget, helpstring("property Environment")]
HRESULT _stdcall Environment([out, retval] IMObject** pVal);
[id(0x00000022), propget, helpstring("property ValueCount")]
HRESULT _stdcall ValueCount([out, retval] int* pVal);
[id(0x00000023), propget, helpstring("property Value")]
HRESULT _stdcall Value(
[in] int id, 
[out, retval] IMValue** pVal);
};

[
odl,
uuid(1B6ED7C5-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMClass Interface"),
dual,
oleautomation
]
interface IMClass : IDispatch {
[id(0x00000033), propget, helpstring("property MemberCount")]
HRESULT _stdcall MemberCount([out, retval] int* pVal);
[id(0x00000034), propget, helpstring("property Member")]
HRESULT _stdcall Member(
[in] int id, 
[out, retval] IMValue** pVal);
};

[
odl,
uuid(1B6ED7C6-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMMapping Interface"),
dual,
oleautomation
]
interface IMMapping : IDispatch {
[id(0x0000003d), propget, helpstring("property MappingCount")]
HRESULT _stdcall MappingCount([out, retval] int* pVal);
[id(0x0000003e), propget, helpstring("property MappingKeys")]
HRESULT _stdcall MappingKeys([out, retval] IMArray** pVal);
[id(0x0000003f), helpstring("method Query")]
HRESULT _stdcall Query(
[in] BSTR sKey, 
[out, retval] IMValue** pVal);
[id(0x00000040), helpstring("method Map")]
HRESULT _stdcall Map(
[in] BSTR sKey, 
[in] IMValue* pVal);
};

[
odl,
uuid(1B6ED7C4-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMArray Interface"),
dual,
oleautomation
]
interface IMArray : IDispatch {
[id(0x00000029), propget, helpstring("property ItemCount")]
HRESULT _stdcall ItemCount([out, retval] int* pVal);
[id(0x0000002a), propget, helpstring("property Item")]
HRESULT _stdcall Item(
[in] int id, 
[out, retval] IMValue** pVal);
};

[
odl,
uuid(1B6ED7C7-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMBuffer Interface"),
dual,
oleautomation
]
interface IMBuffer : IDispatch {
};

[
uuid(1B6ED8C1-EB38-11D1-BF0B-0000B4560A15),
helpstring("MProgram Class")
]
coclass MProgram {
[default] interface IMProgram;
};

[
odl,
uuid(1B6ED7C9-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMProgram Interface"),
dual,
oleautomation
]
interface IMProgram : IDispatch {
[id(0x00000001), propget, helpstring("property FunctionCount")]
HRESULT _stdcall FunctionCount([out, retval] int* pVal);
[id(0x00000002), propget, helpstring("property Function")]
HRESULT _stdcall Function(
[in] int id, 
[out, retval] IMFunction** pVal);
[id(0x00000005), propget, helpstring("property FileName")]
HRESULT _stdcall FileName([out, retval] BSTR* pVal);
};

[
odl,
uuid(1B6ED7CA-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMFunction Interface"),
dual,
oleautomation
]
interface IMFunction : IDispatch {
[id(0x00000001), propget, helpstring("property Name")]
HRESULT _stdcall Name([out, retval] BSTR* pVal);
[id(0x00000002), propget, helpstring("property ParamCount")]
HRESULT _stdcall ParamCount([out, retval] int* pVal);
[id(0x00000003), helpstring("method AddParam")]
HRESULT _stdcall AddParam([in] IMValue* pVal);
[id(0x00000004), helpstring("method ClearParam")]
HRESULT _stdcall ClearParam();
[id(0x00000005), propget, helpstring("property Ret")]
HRESULT _stdcall Ret([out, retval] IMValue** pVal);
[id(0x00000006), helpstring("method Apply")]
HRESULT _stdcall Apply();
};

[
uuid(1B6ED8C2-EB38-11D1-BF0B-0000B4560A15),
helpstring("MFunction Class")
]
coclass MFunction {
[default] interface IMFunction;
};

[
uuid(1B6ED8C3-EB38-11D1-BF0B-0000B4560A15),
helpstring("Mudos Class")
]
coclass Mudos {
[default] interface IMudos;
};

[
odl,
uuid(1B6ED7CB-EB38-11D1-BF0B-0000B4560A15),
helpstring("IMudos Interface"),
dual,
oleautomation
]
interface IMudos : IDispatch {
[id(0x00000001), propget, helpstring("property CurrentObject")]
HRESULT _stdcall CurrentObject([out, retval] IMObject** pVal);
[id(0x00000002), propget, helpstring("property CurrentProgram")]
HRESULT _stdcall CurrentProgram([out, retval] IMProgram** pVal);
[id(0x00000003), helpstring("method SetCommHook, pFunc is the function address.
int commhook(char *buf,int cursize,int maxsize,int user_id)")]
HRESULT _stdcall SetCommHook([in] int pFunc);
[id(0x00000004), helpstring("method Shutdown")]
HRESULT _stdcall Shutdown();
[id(0x00000005), propget, helpstring("property Users")]
HRESULT _stdcall Users([out, retval] IMArray** pVal);
[id(0x00000006), helpstring("method GetUser")]
HRESULT _stdcall GetUser(
[in] int UserId, 
[out, retval] IMObject** pVal);
[id(0x00000007), propget, helpstring("property HeartBeat")]
HRESULT _stdcall HeartBeat([out, retval] int* pVal);
[id(0x00000007), propput, helpstring("property HeartBeat")]
HRESULT _stdcall HeartBeat([in] int pVal);
};
};



请用VC5的classwizard选定MUDOS源码下的Mcon.tlb来自动生成Mcon.h 和 
Mcon.cpp,然后在mudos.h中加上以下定义(这些值是IMValue::Type()的
返回值)
typedef enum eVALUETYPE
{	VP_UNKNOW	= 0,
	VP_NUMBER	= VP_UNKNOW + 1,
	VP_STRING	= VP_NUMBER + 1,
	VP_REAL	=	VP_STRING + 1,
	VP_OBJECT	= VP_REAL + 1,
	VP_ARRAY	= VP_OBJECT + 1,
	VP_MAPPING	= VP_ARRAY + 1,
	VP_CLASS	= VP_MAPPING + 1,
	VP_BUFFER	= VP_CLASS + 1,
	VP_FUNCTION	= VP_BUFFER + 1
}	VALUETYPE;

const IID IID_IMNumber = {0x1B6ED7C0,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMString = {0x1B6ED7C1,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMReal = {0x1B6ED7C2,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMObject = {0x1B6ED7C3,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMArray = {0x1B6ED7C4,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMClass = {0x1B6ED7C5,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMMapping = {0x1B6ED7C6,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMBuffer = {0x1B6ED7C7,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMValue = {0x1B6ED7C8,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMProgram = {0x1B6ED7C9,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMFunction = {0x1B6ED7CA,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const IID IID_IMudos = {0x1B6ED7CB,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};

const CLSID CLSID_MValue = {0x1B6ED8C0,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const CLSID CLSID_MProgram = {0x1B6ED8C1,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const CLSID CLSID_MFunction = {0x1B6ED8C2,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};


const CLSID CLSID_Mudos = {0x1B6ED8C3,0xEB38,0x11D1,{0xBF,0x0B,0x00,0x00,0xB4,0x56,0x0A,0x15}};