Board logo

标题: [其他] 【发布】批处理调用API——APICall [打印本页]

作者: defanive    时间: 2010-2-22 23:12     标题: 【发布】批处理调用API——APICall

http://bcn.bathome.net/s/tool/index.html?key=APICall

自从BatProject开始编写后,越来越忙,临近中考,时间也没了。。。
本已不打算再干第三方这行,但是还是做了这个东西,希望能给批处理带来些变化。。。
这只是一个测试版本,因此还有很多缺陷。。。

从一定意义上来讲,批处理是不可能完美调用API的,因此我只求能做得比别人更好。。。

APICall能做到的是,可以一定限度上使用结构体。。。

调用方式:
APICall Dll路径 API名称 参数1,参数2,参数3……

注意,这是以,为分隔(因为缺陷,无论是否在引号中都会被分割,例如"hello,123")

参数可以是:

Long型数字:传值,例如123
String型文字:传址,但是由于缺陷,必须按照这个格式:"字串符""
由Long型组成的结构体:传址,例如{0;0},注意,这是以;号为分割



返回值:
可以指定返回值(只能在结构体中指定,因为只有结构体是传址):{_0;0}
给结构体中的指定参数加_代表执行完之后将这个值返回
最多可以指定2个返回值,如{_0;_0}
如果不指定,则返回API的返回值
例如指定了{_0;_0},如果执行完之后值是{123;456},那么返回值%errorlevel%将是
100000000+10000*值2+值1,上例的返回值将是104560123
如果只指定一个,那么直接返回值

示例代码一:禁用CMD的关闭按钮
  1. @echo off
  2. APICall kernel32.dll GetConsoleWindow
  3. set hCMD=%errorlevel%
  4. APICall user32.dll GetSystemMenu %hCMD%,0
  5. set hMenu=%errorlevel%
  6. APICall user32.dll EnableMenuItem %hMenu%,61536,1
  7. echo 禁用关闭按钮
  8. pause
复制代码
示例代码二:设置文字颜色
  1. @echo off
  2. APICall kernel32.dll GetStdHandle -11
  3. set hOut=%errorlevel%
  4. APICall kernel32.dll SetConsoleTextAttribute %hOut%,32791
  5. echo hello
  6. pause
复制代码
示例代码三:设置光标位置到(20,10)
  1. @echo off
  2. APICall kernel32.dll GetStdHandle -11
  3. set hOut=%errorlevel%
  4. set /a Pos=20*65536+10
  5. APICall kernel32.dll SetConsoleCursorPosition %hOut%,%Pos%
  6. echo 设置光标到20,10
  7. pause
复制代码
批注:
由API声明可以知道SetConsoleCursorPosition第二个参数应为COORD类型,由2字节X坐标及2字节Y坐标构成,总大小4字节
虽然APICall只支持4字节的参数,整个COORD正好是4字节,因此将2个2字节数据转换成1个4字节数据即可,也就是X*65536+Y

示例代码四:测试CMD所有字体大小
  1. @echo off
  2. APICall kernel32.dll GetStdHandle -11
  3. set hOut=%errorlevel%APICall kernel32.dll GetNumberOfConsoleFonts
  4. set Total=%errorlevel%
  5. for /l %%a in (1,1,%Total%) do (
  6. echo %%a号字体大小
  7. APICall kernel32.dll SetConsoleFont %hOut%,%%a
  8. pause
复制代码
示例代码五:闪烁CMD窗口
  1. @echo off
  2. APICall kernel32.dll GetConsoleWindow
  3. set hCMD=%errorlevel%
  4. APICall user32.dll FlashWindow %hCMD%,1
  5. pause
复制代码
示例代码六:获得鼠标位置
  1. @echo off
  2. APICall user32.dll GetCursorPos {_0;_0}
  3. set PT=%errorlevel%
  4. set /a Y=%PT:~0,-4%-10000
  5. set /a X=PT-10000*Y-100000000
  6. echo 鼠标的位置为:X:%X%,Y:%Y%
  7. pause
复制代码
上例演示了处理两个返回值的方法

可以看到,API给批处理注入了强大的生命力,尽管现在APICall并不完善。。。
希望下载的同学能多多捧场,谢。。。
作者: yslyxqysl    时间: 2010-2-22 23:37

返回值能不能用位运算...
作者: Seter    时间: 2010-2-23 10:04

CallWindowProc到底怎么用...为什么我还是觉得要用asm...
作者: Seter    时间: 2010-3-1 08:28

既然都知道了函数&调用值说明有编程基础,既然有基础还不如自己写程序。。。所以我不觉得APICALL有什么意义。。
作者: Seter    时间: 2010-3-1 08:29

用ASM是肯定可以的。。。都是LONG型嘛。。加个jmp就OK
作者: daols    时间: 2010-3-22 18:51

E:\幻想游戏系列\幻想游戏4.6\天地大冲撞\msvbvm60.dll
-___-...程序里咋还有这些东西。。。有源码么。。。。我想删了图标啥的让程序变小点,,,
作者: sl543001    时间: 2010-4-3 02:20

俺需要精简版,方便的话给一个精简版
就是说吧包括图标在内的所有非必要部分去掉
作者: sl543001    时间: 2010-4-3 02:21

当然,有源码就更好了
作者: bxbian951122    时间: 2010-4-4 17:22

这是vb写的。。那位大哥能改成VC或者Delphi啊。。
作者: defanive    时间: 2010-4-4 18:10

如果能用C++或者其他语言重新写一次的话,可以解决dll的依赖问题,以及文件大小的问题。。。
图标是编译的时候VB自带的图标,不懂如何删去。。。
需要源码的同学可以问我要源码,但是我希望要源码的目的不是要来随便看看而已,希望能真的研究一下,有能力的同学希望能用C++重新写一份,为三方做点贡献。。。
作者: bat007    时间: 2010-4-4 19:24     标题: 回复 10楼 的帖子

你们技术组没有一个会C++的?
作者: defanive    时间: 2010-4-4 21:47     标题: 回复 11楼 的帖子

正值冷清时节,人都不知道去哪了。。。
作者: xie    时间: 2010-4-26 17:50

哥们,参数定义(源码的)的核心能否透露一下,,,
作者: xie    时间: 2010-4-26 17:53

跪求看一下工程源码。呵呵
作者: xueshe165    时间: 2010-10-14 09:46

用ASM是肯定可以的。。。都是LONG型嘛。。加个jmp就OK




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2