📄 ef.h
字号:
EFInt m_nArgCount;
EFArgInfo* m_pArgTable;
// 如果为接口方法,必定为NULL,否则不能为NULL。
EF_PFUNC m_func;
// 如果不为NULL,记录关于本方法的调试信息。
// 如果在接口中,本信息将被转移到EFInterfaceItem信息中记录,此处必定为NULL。
EFMethodDebugInfo* m_pDebugInf;
}
EFMethodInfo;
#define EF_IS_PRIVATE_METHOD(pMethodInfo) \
EF_IS_STATE_PRIVATE ((pMethodInfo)->m_dwState)
// 判断指定类中定义的方法是否会被记录到虚拟调用表中(注意,本宏不适合于接口中定义的方法,接口中的方法必定是虚拟的)。
#define EF_IS_VIRTUAL_CLASS_METHOD(pMethodInfo) \
(((pMethodInfo)->m_dwState & EF_S_M_STATIC) == 0 && \
EF_IS_PRIVATE_METHOD (pMethodInfo) == false)
typedef struct _tagEFFieldInfo
{
#define EF_S_F_STATIC (1 << 0) // 是否为静态成员
#define EF_S_F_CONST (1 << 1) // 是否为常量,注意常量的数据类型不可能为类或接口。
#define EF_S_F_HAS_INITIAL_VALUE (1 << 2) // 本成员是否有初始值, 常量成员本标志默认置位。如果本标志或常量标志置位且数据类
// 型的EF_DatatypeType为EF_DT_CLASS_INTERFACE_ENUM或EF_DT_CLASS_INTERFACE_ENUM_ARRAY,
// 则说明该数据类型为枚举或枚举数组,其初始值被记录在m_vInit.m_int或m_vInit.m_array中。
_EF_DEFINE_GENERAL_INFO
EFChar* m_szDataType;
EFDWord m_dwDataTypeHashValue; // m_szDataType的hash值。
// 如果EF_S_F_STATIC被置位,则本成员用作记录运行时的静态值。
EFValue m_vStatic;
// 如果EF_S_F_CONST或EF_S_F_HAS_INITIAL_VALUE被置位,则本成员用作记录对应的初始值。
EFImmValue m_vInit;
}
EFFieldInfo;
struct EFInterfaceInfo
{
#define EF_S_I_FINAL (1 << 0) // 不能从本接口再派生其它接口。
_EF_DEFINE_BASE_TYPE_INFO
EFChar* m_szBaseInterfaceName; // 可以为NULL或空文本,注意如果有必须是全名。
EFDWord m_dwBaseInterfaceNameHashValue; // m_szBaseInterfaceName的hash值。
// 注意:
// 1、这个表一旦定义并公开后则不可进行任何更改, 想要扩充只能通过继承新接口来实现.
// 2、方法中的EF_S_M_xxx状态值不被支持。
EFInt m_nMethodCount;
EFMethodInfo* m_pMethodTable;
};
typedef struct EFInterfaceInfo EFInterfaceInfo;
typedef struct _tagEFInterfaceItem
{
EFChar* m_szInterfaceName; // 所实现的接口名称,注意应该填写全名。
EFDWord m_dwNameHashValue; // 该名称的hash值。
EFDWord m_dwReserved1; // 必须保持为0
EFInt m_nFuncCount;
EF_PFUNC* m_pFunc; // 注意: 这个表中项目的顺序和数目必须与接口定义完全一致。如有基础接口, 基础接口的方法表应记录在前。
EFMethodDebugInfo** m_ppDebugInf; // 如果不为NULL,则顺序记录上面所有方法的调试信息,此时m_ppDebugInf中的指针数目等于m_nFuncCount。
}
EFInterfaceItem;
typedef void (*EF_PFN_CLASS_LOADED) (EFClassInfo* pClassInfo); // pClassInfo为被载入的类信息
typedef void (*EF_PFN_OBJECT_CREATED) (EFObject* pObject); // pObject为当前对象
typedef void (*EF_PFN_OBJECT_CLEAN) (EFObject* pObject); // pObject为当前对象
// 如果调用时ppRefData提供为NULL,则返回对象数据中所有在CLASSINFO的m_pFieldTable表中没有相应定义项的参考类数据项数目。
// 如果调用时ppRefData不为NULL,则将所有以上数据值顺序填入该内存地址中。
// 具体见EFClassInfo中对于m_pfnGCRefDataGetter的说明。
typedef int (*EF_PFN_GC_REF_DATA_GETTER) (EFObject* pObject, void** ppRefData);
typedef enum
{
EF_COMPILER_UNKNOWN, // 未知编译器
EF_COMPILER_EF, // 易语言编译器
EF_COMPILER_VC, // VC++
EF_COMPILER_GCC // GCC++
}
EF_CompilerType;
//!! 如果在下面各种操作系统下使用的不是所定义的编译器,则应作相应修改。
#ifdef _LINUX
#define _EF_CURRENT_COMPILER EF_COMPILER_GCC
#elif WIN32
#define _EF_CURRENT_COMPILER EF_COMPILER_VC
#else
#error EF_OS type required.
#define _EF_CURRENT_COMPILER EF_COMPILER_UNKNOWN
#endif
struct EFClassInfo
{
#define EF_S_CLS_NO_DEFAULT_INIT (1 << 0) // 对于所有类,编译器都默认其具有一个公开的无参数的空白“初始化”方法。
// 如果不希望具有此默认设置,加上此状态值即可。
// 注意,如果定义了此标志却没有提供任何一个“初始化”方法,则恢复
// 默认设置(等同于未定义此标志)。
#define EF_S_CLS_FINAL (1 << 1) // 是否为最终类,不能从本类再派生其它类。
#define EF_S_CLS_ALLOW_ACCESS_PARENT (1 << 2) // 如果本类为嵌入类,标记本类能否允许访问其所在类型的非私有成员和方法。
// 如果允许,则本类必有名为EF_NAME_PARENT_OBJECT_FIELD_E的数据成员,
// 用作指向其所在类或接口的对象实例。注意:在创建具有此标记的嵌入类对象
// 实例后,必须立即首先填写此成员(包括在调用该类任一初始化方法前),否则
// 后续调用将可能会出错。
_EF_DEFINE_BASE_TYPE_INFO // 注意,类名为全指定名。
EF_CompilerType m_enCompilerType; // 编译本类方法代码的编译器类型。
EFChar* m_szBaseClassName;
EFDWord m_dwBaseClassNameHash;
EFInt m_nInterfaceCount; // 本类所实现接口的数目。
EFInterfaceItem* m_pInterfaceTable; // 指向所实现接口的数组。
EF_PFN_CLASS_LOADED m_fnClassInit; // 当本类被载入系统的时候调用,可以用作初始化类中所有的静态数据成员,可以为NULL。
EF_PFN_OBJECT_CREATED m_pfnObjectInit; // 当基于本类的对象被创建时调用,可以为NULL。注意m_pfnObjectInit不等同于类
// 的构造函数,类的构造函数是可以被继承类的构造函数跳过去的(不调用其基础类的
// 构造函数),但m_pfnObjectInit在任何情况下都将被调用。本成员的主要用途是为
// C++写的类提供创建相关本类对象的额外数据的机会。它在类的构造函数调用之前调用。
EF_PFN_OBJECT_CLEAN m_pfnObjectClean; // 当基于本类的对象将被释放的时候调用,用作进行额外的清理工作,可以为NULL。
// 如果本类数据区中保存有一些非静态非常量参考类数据项(文本、字节集、类对象、接口对象、数组等),且这些数据未
// 在后面的m_pFieldTable表中具有相应定义项,则必须实现此方法。实现此方法后当GC访问到此类的对象时,会通过额外
// 调用此方法来动态获取这些参考类数据并作相应处理以保证不会出现内存垃圾。
// 作用:通过此特性可以实现复杂、动态的对象数据存储,而不必担心由此让GC访问不到而形成内存垃圾。
// 注意:
// 1、一般情况下无需使用本特性,也无需掌握了解;
// 2、静态和常量参考类数据不能通过本方式保存,必须在m_pFieldTable表中具有其相应定义项。
// 3、如果m_pFieldTable表中没有相应数据的定义项,该数据将无法通过“对象.成员”方式来访问,因此有必要提供相应
// 的成员方法来让用户访问到这些额外数据。
EF_PFN_GC_REF_DATA_GETTER m_pfnGCRefDataGetter;
EFInt m_nMethodCount;
EFMethodInfo* m_pMethodTable; // 注意: 这个表中项目的顺序一旦定义并公开则在以后不可删除或更改索引位置.
EFInt m_nFieldCount;
EFFieldInfo* m_pFieldTable; // 注意: 这个表中项目的顺序一旦定义并公开则在以后不可删除或更改索引位置.
EFInt m_nExportEventCount;
EFChar** m_szaryExportEventClassName;
// 记录可能抛出事件对象的类名称,可以是全名或简名,如:"Window.ClickEvent" / "ClickEvent" 等格式。
// 简名表示使用当前类库中的类。
// 这个表中项目的顺序在升级类的时候可以变动索引位置或者删除.
// 如果事件名称以'~'开头,表示屏蔽基础类中对应名称的输出事件,如:
// 假设有个button类定义了一个"button_clicked"类事件输出,那么如果定义了一个"newbutton"类从其继承,
// 然后在其事件输出表中加入"~button_clicked"记录项,则表示将基础类中的"button_clicked"事件
// 屏蔽掉不再输出。
};
typedef struct EFClassInfo EFClassInfo;
/////////////////////////////////////
typedef struct _tagEFEnumItem
{
_EF_DEFINE_GENERAL_INFO;
EFInt m_int; // 枚举值
}
EFEnumItem;
typedef struct _tagEFEnumInfo
{
_EF_DEFINE_BASE_TYPE_INFO
EFInt m_nItemsCount;
EFEnumItem* m_pItems;
}
EFEnumInfo;
//////////////////////////////////////////////////////////////////////////
// 适用语言定义:
typedef enum
{
EF_LANGUAGE_CHINESE = 0, // 中文(中国大陆)
EF_LANGUAGE_BIG5 = 1, // 中文(中国台湾)
EF_LANGUAGE_ENGLISH = 2, // 英语
EF_LANGUAGE_KOREAN = 3, // 韩文
EF_LANGUAGE_JAPANESE = 4 // 日文
}
EF_LanguageType;
//////////////////////////////
// 适用操作系统定义:
#define EF_OS_WINDOWS (1 << 0)
#define EF_OS_LINUX (1 << 1)
#define EF_OS_UNIX (1 << 2)
#define EF_OS_ALL (EF_OS_WINDOWS | EF_OS_LINUX | EF_OS_UNIX)
//////////////////////////////
#define EF_OK 0
#define EF_ERROR -1
//////////////////////////////////////////////////////////////////////////
// 系统可以通知库的码值(>=0):
typedef enum
{
EF_NOTIFY_LIB_LOAD = 1,
// 告知库其已经被装载,在得到此通知后库代码可以做必要的初始化工作。这是库得到的第一个通知。
// dwParam1: (EFObject*)指针,为系统运行时环境的Runtime对象。
// 返回值:忽略。
EF_NOTIFY_LIB_UNLOAD = 3,
// 告知库其即将被卸载,在得到此通知后库代码请做必要的最终清理工作。这是库得到的最后一个通知。
// 返回值:忽略。
}
EF_NotifyLibCode;
typedef EFInt (*EF_PFN_NOTIFY_LIB) (EFLibInfo* pLibInfo, EF_NotifyLibCode enMsg, EFDWord dwParam1, EFDWord dwParam2); // 此函数用作系统通知库有关事件。
typedef EFInt (*EF_PFN_GET_TYPE_INFOS) (EFLibInfo* pLibInfo, EFTypeInfo** ppTypeInfoBuf, EFInt nBufItemCount); // ppTypeInfoBuf如果为NULL则返回库中的类型数目。
typedef EFTypeInfo* (*EF_PFN_FIND_TYPE_INFO) (EFLibInfo* pLibInfo, EFChar* szTypeInfoName);
#define EF_LIB_FORMAT_VER_1 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -