设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: hide秀
打印 上一主题 下一主题

秀秀Win32API教程一(基础篇)

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-8-23
帖子
539
11
发表于 2008-7-28 04:27:53 | 只看该作者
(先push然后pop?不如直接unshift简单.呵呵,玩笑啦)
横版卷轴ARPG制作中... 系统80% 素材95% 剧情1%.... 有脚本问题随时吼我- -(被T出)
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-16
帖子
27
12
发表于 2008-7-28 04:52:01 | 只看该作者
尽管不懂,但还是顶一个
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
433 小时
注册时间
2007-5-1
帖子
993
13
发表于 2008-7-28 05:42:25 | 只看该作者
大师辛苦了……

可惜我还是看不懂呀,感觉那个WIN32API手册说的就是鸟语,API函数的功能一个也没看懂……

嗯,不能浪费签名了,打广告。本人的悲剧作品:
坑化游戏《龙之影》      R剧《星空》     小游戏《剑与拳头》
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

14
发表于 2008-7-28 05:50:29 | 只看该作者
其实api这个东西,不理解也罢,会用就行。。
附带一个ruby里api的内容
  1. /*
  2.   Win32API - Ruby Win32 API Import Facility
  3. */

  4. #if !defined _MSC_VER && !defined _WIN32
  5. #define  WIN32_LEAN_AND_MEAN
  6. #include <windows.h>
  7. #include <stdio.h>
  8. #endif

  9. #define _T_VOID     0
  10. #define _T_NUMBER   1
  11. #define _T_POINTER  2
  12. #define _T_INTEGER  3

  13. #include "ruby.h"

  14. typedef struct {
  15.     HANDLE dll;
  16.     HANDLE proc;
  17.     VALUE dllname;
  18.     VALUE import;
  19.     VALUE export;
  20. } Win32API;

  21. static void
  22. Win32API_FreeLibrary(hdll)
  23.     HINSTANCE hdll;
  24. {
  25.     FreeLibrary(hdll);
  26. }

  27. static VALUE
  28. Win32API_initialize(self, dllname, proc, import, export)
  29.     VALUE self;
  30.     VALUE dllname;
  31.     VALUE proc;
  32.     VALUE import;
  33.     VALUE export;
  34. {
  35.     HANDLE hproc;
  36.     HINSTANCE hdll;
  37.     VALUE str;
  38.     VALUE a_import;
  39.     VALUE *ptr;
  40.     char *s;
  41.     int i;
  42.     int len;
  43.     int ex = _T_VOID;

  44.     SafeStringValue(dllname);
  45.     SafeStringValue(proc);
  46.     hdll = LoadLibrary(RSTRING(dllname)->ptr);
  47.     if (!hdll)
  48.         rb_raise(rb_eRuntimeError, "LoadLibrary: %s\n", RSTRING(dllname)->ptr);
  49.     rb_iv_set(self, "__hdll__", Data_Wrap_Struct(rb_cData, 0, Win32API_FreeLibrary, (void*)hdll));
  50.     hproc = (HANDLE)GetProcAddress(hdll, RSTRING(proc)->ptr);
  51.     if (!hproc) {
  52.         str = rb_str_new3(proc);
  53.         str = rb_str_cat(str, "A", 1);
  54.         hproc = (HANDLE)GetProcAddress(hdll, RSTRING(str)->ptr);
  55.         if (!hproc)
  56.             rb_raise(rb_eRuntimeError, "GetProcAddress: %s or %s\n",
  57.                 RSTRING(proc)->ptr, RSTRING(str)->ptr);
  58.     }
  59.     rb_iv_set(self, "__dll__", UINT2NUM((unsigned long)hdll));
  60.     rb_iv_set(self, "__dllname__", dllname);
  61.     rb_iv_set(self, "__proc__", UINT2NUM((unsigned long)hproc));

  62.     a_import = rb_ary_new();
  63.     switch (TYPE(import)) {
  64.     case T_NIL:
  65.         break;
  66.     case T_ARRAY:
  67.         ptr = RARRAY(import)->ptr;
  68.         for (i = 0, len = RARRAY(import)->len; i < len; i++) {
  69.             SafeStringValue(ptr[i]);
  70.             switch (*(char *)RSTRING(ptr[i])->ptr) {
  71.             case 'N': case 'n': case 'L': case 'l':
  72.                 rb_ary_push(a_import, INT2FIX(_T_NUMBER));
  73.                 break;
  74.             case 'P': case 'p':
  75.                 rb_ary_push(a_import, INT2FIX(_T_POINTER));
  76.                 break;
  77.             case 'I': case 'i':
  78.                 rb_ary_push(a_import, INT2FIX(_T_INTEGER));
  79.                 break;
  80.             }
  81.         }
  82.         break;
  83.     default:
  84.         SafeStringValue(import);
  85.         s = RSTRING(import)->ptr;
  86.         for (i = 0, len = RSTRING(import)->len; i < len; i++) {
  87.             switch (*s++) {
  88.             case 'N': case 'n': case 'L': case 'l':
  89.                 rb_ary_push(a_import, INT2FIX(_T_NUMBER));
  90.                 break;
  91.             case 'P': case 'p':
  92.                 rb_ary_push(a_import, INT2FIX(_T_POINTER));
  93.                 break;
  94.             case 'I': case 'i':
  95.                 rb_ary_push(a_import, INT2FIX(_T_INTEGER));
  96.                 break;
  97.             }
  98.         }
  99.         break;
  100.     }

  101.     if (16 < RARRAY(a_import)->len) {
  102.         rb_raise(rb_eRuntimeError, "too many parameters: %ld\n", RARRAY(a_import)->len);
  103.     }

  104.     rb_iv_set(self, "__import__", a_import);

  105.     if (NIL_P(export)) {
  106.         ex = _T_VOID;
  107.     } else {
  108.         SafeStringValue(export);
  109.         switch (*RSTRING(export)->ptr) {
  110.         case 'V': case 'v':
  111.             ex = _T_VOID;
  112.             break;
  113.         case 'N': case 'n': case 'L': case 'l':
  114.             ex = _T_NUMBER;
  115.             break;
  116.         case 'P': case 'p':
  117.             ex = _T_POINTER;
  118.             break;
  119.         case 'I': case 'i':
  120.             ex = _T_INTEGER;
  121.             break;
  122.         }
  123.     }
  124.     rb_iv_set(self, "__export__", INT2FIX(ex));

  125.     return Qnil;
  126. }

  127. #ifdef _MSC_VER
  128. #pragma optimize("g", off)
  129. #endif
  130. static VALUE
  131. Win32API_Call(argc, argv, obj)
  132.     int argc;
  133.     VALUE *argv;
  134.     VALUE obj;
  135. {
  136.     VALUE args;
  137.     unsigned long ret;
  138.     int i;
  139.     struct {
  140.         unsigned long params[16];
  141.     } param;
  142. #define params param.params

  143.     VALUE obj_proc = rb_iv_get(obj, "__proc__");
  144.     VALUE obj_import = rb_iv_get(obj, "__import__");
  145.     VALUE obj_export = rb_iv_get(obj, "__export__");
  146.     FARPROC ApiFunction = (FARPROC)NUM2ULONG(obj_proc);
  147.     int items = rb_scan_args(argc, argv, "0*", &args);
  148.     int nimport = RARRAY(obj_import)->len;


  149.     if (items != nimport)
  150.         rb_raise(rb_eRuntimeError, "wrong number of parameters: expected %d, got %d",
  151.             nimport, items);

  152.     for (i = 0; i < nimport; i++) {
  153.         unsigned long lParam = 0;
  154.         switch (FIX2INT(rb_ary_entry(obj_import, i))) {
  155.             VALUE str;
  156.         case _T_NUMBER:
  157.         case _T_INTEGER:
  158.         default:
  159.             lParam = NUM2ULONG(rb_ary_entry(args, i));
  160.             break;
  161.         case _T_POINTER:
  162.             str = rb_ary_entry(args, i);
  163.             if (NIL_P(str)) {
  164.                 lParam = 0;
  165.             } else if (FIXNUM_P(str)) {
  166.                 lParam = NUM2ULONG(str);
  167.             } else {
  168.                 StringValue(str);
  169.                 rb_str_modify(str);
  170.                 lParam = (unsigned long)StringValuePtr(str);
  171.             }
  172.             break;
  173.         }
  174.         params[i] = lParam;
  175.     }

  176.     ret = ApiFunction(param);

  177.     switch (FIX2INT(obj_export)) {
  178.     case _T_NUMBER:
  179.     case _T_INTEGER:
  180.         return INT2NUM(ret);
  181.     case _T_POINTER:
  182.         return rb_str_new2((char *)ret);
  183.     case _T_VOID:
  184.     default:
  185.         return INT2NUM(0);
  186.     }
  187. }

  188. void
  189. Init_Win32API()
  190. {
  191.     VALUE cWin32API = rb_define_class("Win32API", rb_cObject);
  192.     rb_define_method(cWin32API, "initialize", Win32API_initialize, 4);
  193.     rb_define_method(cWin32API, "call", Win32API_Call, -1);
  194.     rb_define_alias(cWin32API,  "Call", "call");
  195. }
复制代码

npi(刷能看懂?)
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
93 小时
注册时间
2008-5-16
帖子
745
15
发表于 2008-7-29 04:23:08 | 只看该作者
太棒了{/se}
感谢老版{/qiang}{/qiang}
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-8-4
帖子
34
16
发表于 2008-8-4 23:19:49 | 只看该作者
话说,网上的API帮助都是不全的,似乎连系统默认的都不全,更别说WMP的DLL了……
曾经看到过一本全的,98元,够厚,不敢买……{/fd}
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

17
发表于 2008-8-4 23:21:13 | 只看该作者
以下引用幻獬豸于2008-8-4 15:19:49的发言:

话说,网上的API帮助都是不全的,似乎连系统默认的都不全,更别说WMP的DLL了……
曾经看到过一本全的,98元,够厚,不敢买……

本来就不能说哪个手册实全的
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

18
发表于 2008-8-4 23:24:04 | 只看该作者
方便没vb的同胞
http://rpg.blue/upload_program/files/Winapi_98292202.rar
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
19
发表于 2008-8-5 05:35:29 | 只看该作者
以下引用灯笼菜刀王于2008-7-26 21:50:30的发言:

@_@


此类教程也有过 不过好像很多人不太容易理解


说实话,看了这个教程我也还是不能理解.......看到一半脑就糊了.....

我,我还是新手...


怎么说,同感
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-31
帖子
62
20
发表于 2008-9-24 18:51:45 | 只看该作者
楼主写得不错,其实有点耐心,配合着那个win32api索引查询一下就容易看懂一些了。
我的问题是:
    假设我之前没做过,手边尽管有win32api的查询手册,但怎么根据程序的需求知道应该使用哪个函数呢?比如还是要完成您范例程序里的功能,不看范例,面对手册里面成百上千个函数,我如何能快速知道要用的函数是GetPrivateProfileString、FindWindow、GetPrivateProfileString?
    还有
title =  Win32API.GetPrivateProfileString("Game", "Title")
是不是一定要对应*.ini文件?
(小节名,条目名)里的Game和Title是如何知道的?假如我事先知道是Title,还返回值给title干什么,直接hWnd = Win32API.FindWindow("RGSS Player"," Title"),注意不是hWnd = Win32API.FindWindow("RGSS Player", title)岂不是更省事?这样不是一样可以获得窗体的句柄么?
那个"RGSS Player"类又是如何知道的?难道要到脚本里查?如果以后我要调用这样的参数,从哪里知道这个实参就是"RGSS Player"?{/gg}

我是新手,对脚本和函数的理解还不够,请多指教。



签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 07:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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