游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12308|回复: 48

啊,弄清楚如何动态的调用API了。

[复制链接]

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2007-7-20 12:44:00 | 显示全部楼层 |阅读模式
昨天在网上弄到了篇文章,讲的比较详细。用了些Assembly的东西,但是代码仍然有漏洞。我把漏洞补好,修改了下代码,弄成更容易调用的样子。那么,老样子,开源:
sf_2007720124423.png

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-7-20 12:45:00 | 显示全部楼层

Re: 啊,弄清楚如何动态的调用API了。

Code:

sf_200772012453.rar

9.62 KB, 下载次数:

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-7-20 12:47:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

好像有些函数字符串参数要把Unicode转换成ANSI的。
像上面的MessageBoxA和MessageBoxW就不一样。

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-7-20 12:49:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

顺便问3个问题:

问题1:如何解决多出几个莫名其妙的乱码错误(请自己试一下我贴出的代码)。
问题2:能修改参数的函数如何处理?
问题3:函数的返回值是否都是Long?

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2007-7-20 16:49:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

楼主成精了!

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
发表于 2007-7-20 17:29:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

  顶楼主一下. 哈哈哈

26

主题

75

帖子

77

积分

注册会员

Rank: 2

积分
77
发表于 2007-7-20 19:16:00 | 显示全部楼层

Re: 啊,弄清楚如何动态的调用API了。

函数的返回值是否都是Long??? ????
楼主是美女吗?我顶!

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-7-20 20:59:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

            Case "STRING"
                StoreStringsCount = StoreStringsCount + 1
                ReDim Preserve StoreStrings(StoreStringsCount)
               
                Dim tmpstring As String
                tmpstring = GetSide(Mid$(Parameter, 1, InStr(1, Parameter, ",") - 1), " ", True)
                Dim nLength As Long
                nLength = Len(tmpstring)
               
                If ConvertFromUnicode Then

                    ReDim StoreStrings(StoreStringsCount).Value(nLength + 1)
                    tmpstring = StrConv(tmpstring, vbFromUnicode)
                    
                    CopyMemory StoreStrings(StoreStringsCount).Value(0), ByVal (StrPtr(tmpstring)), nLength
                    
                Else

                    ReDim StoreStrings(StoreStringsCount).Value(nLength * 2 + 1)
                    CopyMemory StoreStrings(StoreStringsCount).Value(0), ByVal (StrPtr(tmpstring)), nLength * 2

                End If
               
                Params(ParamsCount) = VarPtr(StoreStrings(StoreStringsCount).Value(0))

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-7-20 21:07:00 | 显示全部楼层

Re:啊,弄清楚如何动态的调用API了。

VB的数组与字串的直接转换:
Dim a() As Byte
Dim b As String
a = "示例代码"
b = a


其中a并不像你所想象的那样,是以null为结束符的。
VB的数组类因为前面有元素维护它的下标大小,所以它没有浪费内存使用null结束来表示一个字符串。VB可以自己使用这个没有null结束的数组来进行字串操作,但C不能。

直接用=进行字符串赋值,会重定义数组下标长度,即使
Redim a(100) as byte
a = "示例代码"

在进行赋值后,a的长度也不是100,而是4


搞清楚了这两点后,只要再加一个临时buff先把它保存进来,然后再用内存复制拷进去即可。

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-7-20 21:24:00 | 显示全部楼层

Re: Re:啊,弄清楚如何动态的调用API了。

Miu.C: Re:啊,弄清楚如何动态的调用API了。

顺便问3个问题:

问题1:如何解决多出几个莫名其妙的乱码错误(请自己试一下我贴出的代码)。
问题2:能修改参数的函数如何处理?
问题3:函数的返回值是否都是Long?

修改参数?是指传入地址(指针)被函数内部修改么?
其实这个传字串进去就是传指针了。DLL中的函数如果有修改的话,是能获得的。不想用VarPtr,StrPtr,ObjPtr一类函数获地址再用ByVal传入也可以直接用ByRef传入对象。
如果是指动态参数个数的话,那么不用担心。至少__stdcall因为由被调用者清栈,所以无法实现不定参数个数,也不会有这种函数出现的。

VB的函数返回值不能像C一样可以无视。在声明时必须声明一个,否则崩溃。它只管接收eax的值。所以在声明时最好只声明成long。。(要怪就怪VB的IDE的语法检测太恶心了)
至于这个值事后怎么用,强转还是当指针用就无所谓了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 16:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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