赞 | 0 |
VIP | 0 |
好人卡 | 1 |
积分 | 1 |
经验 | 978 |
最后登录 | 2014-2-21 |
在线时间 | 28 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 28 小时
- 注册时间
- 2011-1-12
- 帖子
- 42
|
本帖最后由 爱丽丝·玛格特罗依德 于 2011-5-12 15:24 编辑
API and Win32API
1. 什么是 API
刚刚接触到 API 的人都会问这个问题, "什么是 API? 有什么用?"
API 的全名是 "Application Programming Interface" , 也就是 "应用程序编程接口" . 这么说, 其实很笼统. 具体点的, 就是说, API 是预先就定义好的一组函数, 我们只要知道这个函数的参数, 就可以来调用某个 API 来实现某些功能. 至于 API 函数是怎么实现的? 我们不管它, 我们只需要知道 这个函数 做什么用的就可以了. 要注意的是: API 的函数都是存在于 dll 中的.
API 有什么用? 我们知道, RGSS2 其实就是 Ruby 语言, 但是 RGSS2 由于 EB 在编写的时候, 无意或者故意性的屏蔽了某些方法, 关键字等, 使得我们想扩展 VX 的功能有点障碍. 但是, 有了 API 这个接口, 也就不怕了. 举个例子, 网络游戏通信的核心就是 C++ 的 Socket 库, 它本身就是一个 Window API . 并且, 默认的 VX 没有提供这个功能, 那么我们就只能使用这个 API 函数库来扩展.
API 的分类. 我个人喜欢把 API 分成两类, 这个仅仅只是我个人的观点. 一类是 Window API . 它有微软提供能我们的. 用来为编程者的程序实现或者添加某些功能. 还有一类就是 自定义的 API . API 的实现由程序员编写测试, 然后封装到 dll 里, 给其他的程序使用.
2. Win32API
幸运的是, EB 没有屏蔽一个关键的类 Win32API . 这个类就是负责 dll 文件的加载和 API 函数的调用. 来看下基本语法:
变量 = Win32API.new("dll文件名", "API函数名", "API函数的参数类型", "API函数的返回类型")
★ dll文件名: 指明某个包含后续需要调用的 API 的 dll 文件名字, 比如常用的 user32.dll 等;
★ API函数名: 指明这个 dll 里 导出的 API 函数的名字;
★ API函数的参数类型: 查看手册可以查到 API 的参数类型, 选择有下面4个:
☆ "p" 指针
☆ "n" or "l" long
☆ "i" int
☆ "v" void
★ API函数的返回类型: 查看手册可以查到 API 的返回类型, 选择和上面的一样.
3. 如何使用 APi
我们来举一个简单的例子, API 函数是 MessageBox .
这个函数的功能是 显示一个 消息提示框 . 参数和返回值可以查找 APi手册或者是 百度百科. 引用下 百度百科:
函数原型 : int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType)
函数速查: Windows:3.1及以上版本:Windows:95及以上版本;Windows:1.0及以上版本;头文件:Winuser.h;库文件:USer32.lib;URicode:在Windows NT上实现为Unicode和ANSI两种版本。
从以上的信息, 我们可以得到:
★ dll文件名: user32.dll , 这个可以看到 库文件:USer32.lib , 这个 lib 的名字就可以对应一个 dll .
★ API函数名: MessgaeBox , 就是我们需要的, 注意大小写.
★ API函数的参数类型: 这个需要一点点 C++ 知识. 没有的话, 可以参考 VB 的 API 手册, 都是一样的.
可以知道 MessageBox 的参数有三个,
HWND hWnd : 类型是 HWND, 可以知道, 不是 v 不是 i 也不是 l (这里其实就是 l . ), 那么就只能是 p ;
LPCTSTR lpText,LPCTSTR lpCaption; 这两个类似的判断和之前的一样, 只能是 p , 表示字符串.
UINT UType: 看不出来是啥, 于是 继续百度 define UINT , 于是可以查看 #define uint unsigned int , 于是 知道是 i (出现了 int), 至于为什么这个查找, 参考 C++ 的 #define .
★ API函数的返回类型: 就是第一个单词, int 于是就是 i .
注意一下: 如果某个 API 没有参数的, 参数3 可以简写成 nil 或者 "v". 返回值是 void 的话, 参数4 也可以简写成 nil , 或者 "v"
然后来创建一个 WIn32API 类的实例:
messagebox = Win32API.new("user32.dll", "MessageBox", "pppi", "i")
这里注意的是, 参数3 有多个参数的话, 可以写成 字符串 或者 %w( ), 其实也是字符串
创建之后就可以来使用了, 使用的方法是 call 方法. call 方法的参数, 参考我们之前创建的 参数3 或者函数原型.
messagebox.call(
0, # 第一个参数是 HWND, 窗口句柄, 可以不去理会他, 填写 0 即可.
"Hello World", # 第二个参数是一个字符串, 就是 提示框需要显示的内容
"Message", # 第三个参数还是一个字符串, 表示提示框的标题
0) # 最后一个参数是 提示框的类型, 不常用的, 可以直接写 0.
这样就可以实现调用一个 API 了
|
|