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);
怎么改?
页: 1 [2] 3
查看完整版本: 自制新版jAPI,兼容1.20e/1.21b/1.22(附带源代码)