大势已去,那么就不需要遵守所谓“原有的规则”了。
在本篇中,我会介绍至今为止发现的所有“黑科技”,还请绝对不要眨眼。

编辑于2021.6.16,转载请注明原作者

前言

铃心自定义很大可能性上不会再更新了——至于它的替代品,我觉得也只有一些正经开发的道路能配得上了。

本篇我们会讲什么?

并非从零开始,我们会介绍DLL调用,XQ与mirai双框架,以及ImageMagick系列相关的技术以及其进一步的研究方法。
其中,DLL调用和双框架可以视作一个底层的拓展方式,而ImageMagick相关的内容只能视作一个对铃心上层应用实现的一个拓展方式。本篇会着重于前者的介绍而非是后者。

为什么现在要讲这些?

一是目前来看,铃心自定义很大概率不会更新了,这意味着原有的规范已经丧失了其具体的意义,那么保守只是一种极其弱智的想法。
二则是因为我个人的一些原因:我很有可能不会再投入到以铃心自定义为基础的开发之中了。因此在合适的时候放出这些方案可以很大程度上的惠及后人。
三则是我的网站换了一个新主题,发个帖子让大家看看。

那么,什么样的人能够看懂这些?

任何人都可以看懂这些,并且我可以保证,只要你认认真真看完,会对你的铃心之路大有帮助——甚至可以导致极其重大的想法/思路改变。
这些方法将会导致一些本质方法上的变化,能够完完全全摆脱铃心自身框架的束缚。

你的期望是什么?

在本篇中,我将着重介绍原理以及这些东西的来源和进一步的研究方法,而后会直接放出我的成果以及使用方法。我的希望是能够有人完全理解这些东西的用法并且给铃心带来继续发展的可能。

正文

以下所有内容均视为使用XQ框架上的铃心自定义。
但这并不意味着其他框架无法使用类似的方案。只是可能稍有区别。

DLL直接调用xqapi.dll

众所周知,在下载xq的时候,必要的文件(文件夹)只有两个,一个是bin,一个则是XQ的主程序。

在bin中我们可以看到一个名为xqapi.dll的东西——那么它是什么呢?它名为api难道真的可以提供api吗?

如果你有接触过XQ的开发,那么一定对其易语言的开发SDK有所印象——在其中我们可以清楚的看到,其对API的调用其实都是完全基于DLL的。因此我们可以判断出来,xqapi.dll就是XQ访问API的重要通道。

而众所周知(并不),铃心中存在着一个直接调用外部DLL拓展自身的方法——如果我们通过这个方法,能够直接调用xqapi.dll让我们直接获取api而不需要经过XQ的外壳呢?

注,该方案在XQ成为铃心主平台后不久便被发现。在那时XQ的SDK中所有的API指令均为DLL操作。但是在XQ的新规范(貌似是所谓的S3规范?铃心现有编译版SDK采用的并非S3,因此会提示版本过低的消息。)中,所有的DLL操作均被打包在内部,暴露在外的则变为了他们规范好的新的接口,但是其调用方法和传入参数方式基本不变。

一个SendMsg的S3规范示例

极其重要:S3规范中的api名称(如上图的 SendMsg )是经过规范后的名称,实际dll调用需要参考老版本sdk。
绝大部分规范后的结果只是删除了前面的Api_,因此这个发送消息的实际调用函数为Api_SendMsg而非SendMsg

那么假设我们已知了如上图一样的参数以及请求需要,我们如何调用dll为我们服务呢?
首先,我们必须要了解到,DLL的调用需要有两个步骤,第一个步骤是将DLL装载到铃心的主程序中,作为一个主程序的方案;第二则是将DLL中的函数加以使用运行。
那么这两个步骤对应的铃心指令分别是【装载】和【DLL】,下面我以一个较为简单的群聊函数作为示例。

好,这样我们就完成了,我们略微讲解一下装载的特性。

首先,装载决定了后面的DLL使用的是什么函数,因此在调用不同的API的时候需要通过装载来进行切换。值得注意的是,铃心内部会判断到底有没有装载过这个函数,因此在反复调用一个API的时候并不需要担心反复装载导致的效率低下问题。

其次DLL后面参数的具体类型可以在XQ的SDK中查阅得到,请不要胡乱填写,请一定要按照SDK内的要求填写——尽管有的地方很迷惑,比如说群号的类型是文本而非整数。

最后,最为重要的是,我们复习一下DLL函数:
【DLL [返回类型]>=<[参数类型][参数1]>=<[参数类型][参数2]>=<[参数类型][参数3]…】
有看到这里的返回类型吗?一定要注意,在DLL后面有一个空格!!有一个空格!!!
其次,返回类型虽然可省略,但是在已知返回参数的情况下尽可能带上——对于某些类型不确定的返回那就不要带了——反正获取了也没太大的意义。
请注意,如果返回参数类型定义错了/没有类型的返回参数被强行定义会导致XQ框架报错然后崩溃!

xqapi.dll铃心函数库

在一段时间的开发过后,我发觉这样的东西在很多情况下都可以用上——不光是获取某些以前无法获取的东西,还包括一些特殊方法——如双框架等。在这些特殊场景下,我们需要这样的dll调用方式来为我们工作。

因此,为了简化流程,我把几乎所有可用/有意义的函数全部打包,现列如下,具体参数含义请自行尝试,我不进行具体解释,有想法的人可以翻阅XQ SDK进行确认。

后记

不敢说我是第一个发现这么“玩”的人,因为在我想到的第一周时,就在跟某幽幽子交流的时候,他认为这应该是一个极其容易被想到的方法——但不管怎么样,这个方法的提出令我振奋许久——它代表着在XQ时代我们有着一个崭新的方法能够完全实现以前我们所想要达到的巅峰——我确确实实做到了,利用一个略有残疾的系统(指铃心)达到了插件能够达到的几乎一切。

本篇编辑有些急促,也没有进行校对之类的工作,上文中肯定会有很多纰漏或者没有解释清楚地地方。
如果对某些函数有疑惑/对本文有改进意见,还请通过博客上方的QQ按钮联系我(8361936310),万分感谢。

本篇作为黑科技系列的第一篇,大家应该真真确确的感受到了“黑科技”的感觉——但是不要眨眼,因为真正的黑科技现在还没有完全展现,对于一个向往学习更加深入的人,只停留在铃心的表面是远远不够的——我们应该做的是从铃心出发,走得更远、更远。


我什么都不懂,我只会现学现卖,谢谢配合。