梦魇骑士 发表于 2013-7-16 22:54:08

ERA插件编写--认识插件和SDK

从本篇开始讲解插件相关的编写,以及ExtendedErmFunction编写的实例。希望更多有编程基础的朋友对ERA插件编程有所了解,另外揭开插件的面纱,其实他并不神秘。
       插件其实是一个DLL文件,又叫动态库链接文件,这个不多说。ERA平台会遍历MOD目录里面的目录,在这些目录下的EraPlugins文件夹里面寻找.dll和.era扩展名的文件,尝试用LoadLibrary加载进进程空间。这里值得注意的是.era扩展名的文件,他是ERA2.3以后的标准扩展名,只是扩展名不同而已,他本身仍然是个DLL文件。
       也就是说,任何有效的DLL放到mod的EraPlugins目录下都会被加载,和编程语言无关。看到这里,学习VB的同学可以安心,如果你的DLL无法被加载,我立马给你50000WOG币的精神损失费。
       现在说说SDK,位于Tools\Era\SDK。这里以C语言对应的era.h为例。SDK的作用就是便于开发,提供了很多定义好的结构体,以及定义很多angel.dll中的函数,这个angel.dll是ERA提供的一个“桥梁”,里面导出函数可以方便得让我们控制ERA的方方面面。
       如果没有提供的SDK,比如VB编程的朋友,可以根据era.h变换成等效的VB代码,一样可以方便得链接ERA平台。本篇的目的是在于介绍插件和SDK,这里介绍使用SDK的第一步,以后的篇幅将逐步解析SDK的各个方面。
#include "Era.h"//包含SDK头文件
using namespace Era; //使用SDK命名空间
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
    ConnectEra(); //调用函数ConnectEra();连接ERA平台
    //做你想做的事情
}
return TRUE;
};
       基本来说,简单的几步,就可以使用SDK的函数、结构体了。对于VB而言,导出angel.dll的ConnectEra函数后用同样的方法,也可以开始插件的开发了。必须说明的时,不使用SDK也可以开发出插件,SDK只是一个方便得函数接口,而并非必须的,这个视你需要实现的功能而定。

兽哥哥 发表于 2013-7-16 23:01:58

如果你的DLL无法被加载,我立马给你50000WOG币的精神损失费。

真是捡来的娃儿当脚踩!:nianjing:

梦魇骑士 发表于 2013-7-16 23:02:05

对了,如果不是提问的帖子,我希望大家不要无意义插楼,这个对不起了,这个帖子我会继续完善下去,为方便查阅,所以希望大家理解。上面我师傅的算了,谁让他是我师傅呢。

mstong 发表于 2013-7-16 23:22:03

原帖由 梦魇骑士 于 2013-7-16 23:02 发表 http://bbs.h3wog.com/images/common/back.gif
对了,如果不是提问的帖子,我希望大家不要无意义插楼,这个对不起了,这个帖子我会继续完善下去,为方便查阅,所以希望大家理解。上面我师傅的算了,谁让他是我师傅呢。 你先写好,然后一直粘贴复制,这样就可以避免别人插楼了!

克招 发表于 2013-7-16 23:25:10

VB可以,意思就是JAVA和C也可以了?

贤知有您 发表于 2013-7-16 23:35:38

当我渐渐淡泊的时候,梦魇你又来催化了
拿vb来搞插件,我看我真受不了;dao;

梦魇骑士 发表于 2013-7-17 09:42:27

回复 论坛兴旺玩家受益 5# 的帖子

只要你能做出dll,就可以了。

贤知有您 发表于 2013-7-17 10:15:46

回复 7# 的帖子

话说做出DLL和做出与H3关联的DLL不是那么一码事.
看来有空得试试,来验证一下梦魇的描述.

梦魇骑士 发表于 2013-7-17 23:36:21

ERA插件编写--插件操作ERM变量

承接上面一部分,这部分讲如何使用ERM中的变量。在插件里面,我们怎么使用v变量、z变量呢?答案是直接操作他们所在的内存。听起来似乎不容易,事实上SDK已经把这些地址给出来并且复制给了C变量,请看era.h以下部分:

/* WoG vars */
int*      v = (int*)      0x887664; // 1..10000
TErmZVar* z = (TErmZVar*) 0x9271E8; // 1..1000
int*      y = (int*)      0xA48D7C; // 1..100
int*      x = (int*)      0x91DA34; // 1..16
bool*   f = (bool*)   0x91F2DF; // 1..1000
float*    e = (float*)    0xA48F14; // 1..100

为了编程不混淆,SDK使用了和erm一样的变量名字,用数组来对应erm变量。譬如说,我们在erm中使用VRv2:S7;让v2变量指为2,对应的,在插件里直接使用v = 7;可以达到同样的目的。同理有一下几个例子:

VRz900:S^fack 007^;-> strcpy(z, "fack 007");//注意给z变量“赋值”要把字符串复制过去
VRv100:S89; -> v = 89;

可见,通过SDK定义好的变量,可以方便的使用和修改各erm变量的值,这样,就可以达到插件和erm的“沟通”。
页: [1]
查看完整版本: ERA插件编写--认识插件和SDK

捐赠