Soar
发表于 2009-2-27 12:52:33
引用第19楼血戮魔动冰于2009-02-27 12:49发表的:
我真的是白痴……japi.dll用什么工具才可以查看?
还有怎样看魔兽的内存/堆栈?
winhex或者ultraedit-32就可以编辑
血戮魔动冰
发表于 2009-2-27 13:05:02
谢谢。
【还有怎样看魔兽的内存/堆栈?】这个问题~~貌似无解答~~
actboy168
发表于 2009-2-27 13:08:29
引用第13楼Soar于2009-02-26 18:37发表的:
回楼上,我没有认真看堆栈的压入顺序,但老版本的jAPI的jNative的定义确实是__stdcall
我去看了sourceforge的w3grimoire仓库看了源代码,现在仍然是定义为__stdcall
旧版的japi好像不太稳定,这可能就是原因?
暴雪写的native都是cdecl,至少120和122是这样
actboy168
发表于 2009-2-27 13:08:47
引用第21楼血戮魔动冰于2009-02-27 13:05发表的:
谢谢。
【还有怎样看魔兽的内存/堆栈?】这个问题~~貌似无解答~~
用OD
Soar
发表于 2009-2-27 13:26:53
引用第22楼actboy168于2009-02-27 13:08发表的:
旧版的japi好像不太稳定,这可能就是原因?
暴雪写的native都是cdecl,至少120和122是这样
我认真用OD查看了1.22里StringCase(string, boolean)这个函数
首先是sub esp,404
然后处理处的字符串
最后再比较处的boolean值
那么根据堆栈压入的原则(写4个字节到栈顶,然后esp-=4),应该是先压入了boolean到esp+40C,然后再压字符串到esp+408
这个压入顺序应该是__stdcall(__pascal)才对,并不是__cdecl
血戮魔动冰
发表于 2009-2-27 13:30:07
OD全名什么?我要下载~~
Soar
发表于 2009-2-27 13:43:53
引用第25楼血戮魔动冰于2009-02-27 13:30发表的:
OD全名什么?我要下载~~
OllyDbg,要能使用,需要足够的IX86汇编知识。
linzefei
发表于 2009-2-27 13:54:03
actboy168
发表于 2009-2-27 14:18:57
引用第24楼Soar于2009-02-27 13:26发表的:
我认真用OD查看了1.22里StringCase(string, boolean)这个函数
首先是sub esp,404
然后处理处的字符串
.......
stdcall和cdecl的参数压入顺序都是一样的,区别是在返回时,stdcall在返回时会自己平衡栈,cdecl则是在返回后由调用它的函数来平衡
Soar
发表于 2009-2-27 14:51:44
引用第28楼actboy168于2009-02-27 14:18发表的:
stdcall和cdecl的参数压入顺序都是一样的,区别是在返回时,stdcall在返回时会自己平衡栈,cdecl则是在返回后由调用它的函数来平衡
查了文档,确实是我记错了,不好意思,而且认真查看了暴雪写的Native函数确实绝大多数都是__cdecl,但也有少量__stdcall
为了解除疑惑,我跟踪到了Jass处理代码的上一层,看到esp是被预先保存下来,运行完Jass的Native函数后再直接还原的,中间不管是调用__cdecl还是__stdcall都不会弄乱堆栈。
因此以前的不稳定问题,应该不是__cdecl和__stdcall之差引起的
Renee
发表于 2009-2-27 15:20:05
出来支持下~~
血戮魔动冰
发表于 2009-3-2 13:03:02
再问:用什么工具使.cpp转换成.xjp文件?
actboy168
发表于 2009-3-2 18:52:35
编译成dll,然后改名
血戮魔动冰
发表于 2009-3-3 13:01:03
如果我用VC的话,怎么组建dll文件(我真的是个白痴)
actboy168
发表于 2009-3-3 13:13:06
你是用VC几?
这是vc2008的方法
新建一个项目,然后在项目属性页里把配置类型改成"动态库(.dll)",就可以了,release,debug两个方案都改一次。
vc2005也一样,vc2003没用过
血戮魔动冰
发表于 2009-3-3 13:16:46
貌似VC6.0行不行~~
(Dev-C++也行)
actboy168
发表于 2009-3-3 13:54:24
vc6.0直接建个dll工程,看图
血戮魔动冰
发表于 2009-3-3 16:09:11
谢
然后如果想测试的话,先运行weloader,然后再新建图什么的就行了吗?
还有:
1.我用global function组建对魔兽的接口函数(前面加jNATIVE),能用不加jNATIVE的class方法吗?
2.VC中的int只要直接return,就可以在魔兽中得到它的值吗?
万望解答~~
actboy168
发表于 2009-3-3 16:16:51
http://www.islga.org/bbs/read.php?tid=1509
这里已经有写自定义函数的整个过程,请仔细阅读
1、不明白你说什么
2、对
血戮魔动冰
发表于 2009-3-3 16:35:03
还有,为什么我用Dev-C++和VC这行都报错呢?
typedef void (jAPI *jpAddNative)(void *routine, char *name, char *prototype);
typedef jString (jAPI **jpStrMap) (char *str);
typedef char * (jAPI **jpStrGet) (jString strid);
怎么改?