【加入支持库开发QQ群:547525064】
二、原理阐述以及问题解决
探索一下支持库开发的简化, 需 配合 eDiff 中的 eLibEx.h 阅读.
__E_STATIC_LIB
__E_STATIC_LIB 是 elib SDK 中的静态库定义的宏, 被 #ifndef __E_STATIC_LIB 和 #endif 包起来的代码在编译 .fne 的时候不会被编译.
ELIB_DIRTY
ELIB_DIRTY 是利用脏兮兮的宏将很多代码封装在 eLibEx.h 中, 实际上代码还是在 main.cpp 里, 只是不会那么碍眼.
如果你去仔细查看 ELIB_DIRTY 会发现里面实际上有很多东西, 包括静态变量、函数等等.
ADD_CMD
ADD_CMD、ADD_CMD_EX、ADD_CMD_N0ARGS、ADD_CMD_N0ARGS_EX 这四个宏是添加支持库导出命令用的, 带 EX 的参数比较详细, 不带的则比较简化, 有默认设置.
ADD_CONST
ADD_CONST、ADD_CONST_EX 是添加支持库常量用的, 同上.
ADD_LIB_INFO
ADD_LIB_INFO 其实是 GetNewInf 这个 fne 导出函数, 本来可以设计成传参数的, 想了想没设置, 你可以按照自己喜欢的来修改.
ADD_TYPE
ADD_TYPE、ADD_TYPE_EX 是添加支持库数据类型用的, 其余同上, 但是要注意, 它是"无限参数"(可变参数), 可是 __VA_ARGS__ 并不被 vc6 所支持, 我用了一种思路避过了这个限制:
我们知道, .fne 实际上是一个动态链接库(DLL), e.exe 通过 GetNewInf 获取到支持库的各种信息, 包括函数指针, 而在 F5 调试时, 实际上调用的是 fne, 静态编译的时候 e.exe 才会根据 NL_GET_CMD_FUNC_NAMES 这个消息返回的函数名称数组去链接 _static.lib .
所以例如我想实现用易语言 vc6 的 linker 可以静态编译的支持库, 我只需要保证 _static.lib 就可以了, 而 .fne 完全可以用高版本的 sdk 来编译, 而恰好这些宏都被 #ifndef __E_STATIC_LIB 所包裹, 在生成 _static.lib 的时候根本不会被编译, 于是问题解决!