幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6434|回复: 7

[NS] [原创]关于dll插件的一些问题

[复制链接]

1

主题

2

帖子

44

积分

②入门

积分
44
发表于 2006-2-16 14:30:39 | 显示全部楼层 |阅读模式
偶三天前才接触NS和这个论坛,所以不知道这个问题有没有前辈发过,如果重复了还请见谅…………

首先小赞一下高桥,那家伙还算厚道,程序包里不仅送上了三个dll插件和使用范例,还把三个插件的源代码也送出来了……要不是那些源代码根本就不可能知道这鬼插件的工作原理…………高桥下次要是能把主程序的源码也送上好了~~~~~~

然后大骂一下高桥,那家伙太不厚道,不仅没把dll函数的调用机制写出来,连命令集都没给出完整版的(第一个例子里的setlayer和layermessage命令就从没见到过,参数也无从说起),甚至有的指令都没把所有功能给出来。比如bg命令的这条语句:bg White,99,1000,"effectdll.dll"(取自第二个例子)当定义效果为99时表示使用dll插件做显示效果,也只有在99时参数才会多出来一个(就是那个"effectdll.dll")。效果参数我只试了88-99,除了99外只有90程序不报错,但是是干什么用的就完全不知道了……换句话说就是只要是关于这个dll插件的东西高桥都没给出说明来。
回到dll的问题上,在主程序里定义了很多没有公开的函数,这些函数貌似只有在调用dll时才能用的上,而那些dll插件里开头定义的也都是指向这些函数的指针,这给我们自己写插件倒也带来了些方便,问题是高桥那厮还是没有给出那些函数的具体功能和参数,只有我们自己根据函数名和例子里的调用过程连猜带蒙了……最不厚道的应该要数插件的调用机制了:插件里函数的参数和程序调用过程中带的参数完全对不上号!这只可能是程序调用的插件里的函数名字和参数完全是固定死的,换句话说我们只能修改现有的函数体却没办法自己写出新的函数来调用因为我们不知道程序能调用的函数名和参数传递的过程……(喘口气)
为了证实这点,我重新编译了第一个例子的dll文件,第一次把开头定义的函数指针指向的函数名改了一下,如果猜想正确的话,那个指针将不能指向正确的函数,那么应该编译时没问题,运行时在调用那个函数的地方报错;第二次把新定义的函数名改了一下,如果猜想正确的话同样能通过编译,但程序调用那个函数时会因为名称不同而找不到地方。实验结果是,第一次程序直接发生错误退出了,第二次正常运行,但特殊效果完全没有了。这证明了猜想应该是正确的………………(骂:高桥个变态~)

至此,得出结论:在高桥给出关于dll插件的详细说明之前,我们只有通过修改所给的三个例子来达到某些特殊效果了——显然,能做出来的东西非常有限,只能是和那三个例子神似形不似的东西……不过某帖子里说的那种最常用的下雨效果应该还是能做出来的……

orz 终于打完了……偶还是个新人,第一次发这种长篇大论的东西,还请各位前辈多指点一二,如果有错误的地方麻烦指出来,感激不尽…………
回复

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2006-2-17 16:48:56 | 显示全部楼层
[s:5] 顶一下楼主...基本上...不要指望高桥厚道...真的...
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

1

主题

2

帖子

44

积分

②入门

积分
44
 楼主| 发表于 2006-2-17 18:39:35 | 显示全部楼层
刚发现的问题:下雨我倒是做出来了,不过…………停不下来了……确切的说,目前能实现的停下来的效果看起来很不自然………………高桥……掐死他……掐死他……掐死他……(碎碎念ing)
回复 支持 反对

使用道具 举报

2

主题

11

帖子

1417

积分

⑥精研

积分
1417
发表于 2006-2-18 00:09:45 | 显示全部楼层
把主程序的源码给出来~~~他就不用混了

话说下雨很简单了,偶尝试过另外弄回想的说~~结果~~不言而喻

高桥果然bt
回复 支持 反对

使用道具 举报

9

主题

1512

帖子

9136

积分

荣誉群

Cod3r

积分
9136

终身成就奖

发表于 2006-2-18 14:29:40 | 显示全部楼层
NS是半商業的東西,如果需要一些定製的東西恐怕得付些錢吧,
如果是商業遊戲可以得到完整的技術支援(一般用戶能有DLL範本已經很多了)

不過其實很多同類工具具較多自由性,HSP和KRKR都有完整的SDK文件
(\\__/) (O.o ) (> < ) This is Bunny.
回复 支持 反对

使用道具 举报

125

主题

288

帖子

1387

积分

⑥精研

积分
1387
发表于 2006-2-22 18:22:21 | 显示全部楼层
也许高桥对ASM不熟悉,所以他不知道如何给不定参压栈并跳到指定地址运行

HSP/KRKR跟NS应该不能算同类工具吧
回复 支持 反对

使用道具 举报

125

主题

288

帖子

1387

积分

⑥精研

积分
1387
发表于 2006-2-22 19:20:47 | 显示全部楼层
稍微瞄了几眼

从以下源码中的声明

extern &quot;C&quot; __declspec(dllexport) void Effect (HDC screendc,HDC destdc,HDC srcdc,unsigned char *dest,unsigned char *src,RECT *r,char *param,int miliwait);

以及所跟的注释来看,Effect被定义成唯一的外部DLL调用标识函数名,而param处存放整条引用到该DLL的NS脚本语句。我们要在命令中加入参数,则无法自行决定参数的个数和类型,只能从这个传过来char指针处获取一行字符串。

NS内部的导出函数名可以用W32DASM查看,参数个数有点麻烦,从下面这段反汇编代码

Exported function : NscrGetWindowSize
0043C740            mov    eax,dword ptr[esp+04]
0043c744            mov    ecx,dword ptr[0045F330]
0043C74A            mov    edx,dword ptr[esp+08]
0043C74E            mov    dword ptr[eax],ecx
0043C750            mov    eax,dword ptr[0045FF34]
0043C755            mov    dword ptr[edx],eax
0043C757            ret


可以看出,NS的内部导出函数同样遵从declspec调用约定,在ret时没有去修正esp的值。由于不是stdcall或fastcall约定,堆栈必须由调用者恢复,因此参数的个数将是无法确定的。虽然通过以上代码我们可以很轻松的确认这个函数使用了两个指针参数,分别用于获得游戏窗口的宽和高,但一些复杂的导出函数在经过C编译器优化后并不是那么容易弄懂其具体作用。
回复 支持 反对

使用道具 举报

125

主题

288

帖子

1387

积分

⑥精研

积分
1387
发表于 2006-2-23 14:26:33 | 显示全部楼层
追记:

原来还有个exec_dll,不过仍然不能自定义名称,呵呵

另外一个setlayer可以说是事先约定好的hook函数集合,如果你在dll中提供了指定名称的接口,那么NS就会在处理某些东西的时候调用它(类似于Windows回调机制)。这样dll就有机会干涉正常的处理过程(废话),而一些带有BOOL返回值的回调函数(如定时器)也允许dll改变NS的程序执行流程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-19 15:08 , Processed in 0.026324 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表