[连载]用capi调用windowsapi教程
bat吧
全部回复
仅看楼主
level 8
Pro_Batch 楼主
用capi可以调用绝大部分的winapi,其功能之强大,令人发指,然鲜有人在bat内使用,大多求助于第三方如image。今日来一篇教程说明如何使用她。
@Cyxgg
2013年07月31日 08点07分 1
level 8
Pro_Batch 楼主
首先介绍capi中的——常用——前缀
.意义:byte,字节;char,字符
:意义:word,字;short,短整型
;意义:dword,双字;int,整型(32位操作系统);pointer,指针;
@意义:指针后移n个字节(指针+n)
*意义:bat中变量的地址
注意:所有前缀皆是英文字符
2013年07月31日 08点07分 2
level 8
Pro_Batch 楼主
调用方式:setcall与getcall
copy :CAPI支持两种调用方法,GetCall和SetCall
默认情况下SetCall处于开启状态,GetCall处于关闭状态
SetCall调用方法是用set命令修改CAPI变量值完成的,如set "CAPI=Mem Alloc 8"
GetCall调用方法是用%(或!)查询变量名完成的,如%CAPI Mem Alloc 8%
CAPI_Ret变量储存执行的返回值
CAPI_Err变量储存调用API后GetLastError的返回值
这两个变量的内容请在命令执行完之后及时复制到其他变量
在GetCall中命令的变量会被解析成CAPI_Ret的值
2013年07月31日 08点07分 3
level 13
看不懂是关键
我还是继续用图形工具吧。。。
2013年07月31日 08点07分 4
level 12
普通人能知道byte,char,word,short,dword,int,pointer有什么区别么= =
批处理里面只要知道变量可以存储字符串就可以了。。。
2013年07月31日 08点07分 5
我尽量通俗一些[委屈]
2013年07月31日 08点07分
给批处理使就要个int就够了吧……用dword太多于了
2013年07月31日 09点07分
对了,还有char
2013年07月31日 09点07分
level 8
Pro_Batch 楼主
W版本与A版本
凡是涉及到字符串的api一般有两个版本,分别对应unicode与ansi,你只要记住选w版本就对了
2013年07月31日 08点07分 6
level 8
Pro_Batch 楼主
实例1:调用messageboxw
api名称:MessageBoxW(注意大小写)
messagebox函数可以创建一个对话框,如图
实际上,vbs中的msgbox函数就是调用这个api实现的
程序:
@echo off&setlocal enabledelayedexpansion
CAPI
set CAPI=Var GetCall Enable
set text=hello world!
set wintitle=my first capi application
set ret=%capi api call user32.dll MessageBoxW ;0 *text *wintitle ;0%
echo %ret%
pause
2013年07月31日 08点07分 7
回复 a20001017 :到批处理之家下载
2013年07月31日 10点07分
不如msg.exe来得实在啊。。。 还有程序。。。
2013年08月05日 05点08分
回复 Pro_Batch :网址。。。 找不到啊 汗。。。
2013年08月05日 05点08分
level 8
Pro_Batch 楼主
首先,messagebox我们选的是w版本,所以就是messageboxw。
程序的简单分析:(下面详细分析)
第一行,不用说了
第二行,注意,要使用capi必须先加一句代码:capi
第三行,打开capi的getcall模式
第四五行,先将标题,提示文字加载到内存中
第六行,调用api
第七行,输出api返回值
第八行,不用说了
2013年07月31日 08点07分 8
level 7

2013年07月31日 08点07分 9
level 13
2013年07月31日 08点07分 10
level 8
顶一个,忘LZ继续教
2013年07月31日 08点07分 11
level 13
误报率太高。
2013年07月31日 09点07分 12
很正常,capi是直接注入的cmd,杀软不爆肚才怪了
2013年07月31日 10点07分
level 8
Pro_Batch 楼主
一个api,你最关心的当然是它可以实现怎样的功能,如果你想在bat里延迟n秒,应该用什么api呢,最好的办法是baidu或geogle,这样你就能查到你所需的api名称了,这是第一步,你确定你要调用的api的名称
2013年07月31日 12点07分 13
level 8
Pro_Batch 楼主
我们用baidu搜索"api 延时"(不要告诉我你不会)会发现,搜到的结果要么看不懂,要么更本就不是要找的,所以在这里,我推荐股沟搜索geoogle,同样搜索api 延时,你点第一个链接,就找到了你想要的结果。
2013年07月31日 12点07分 14
level 8
Pro_Batch 楼主
这几天跟网友讨论一个程序优化问题时,遇到一个需要延时的循环,结合我所知道的知识,并突发灵感,想到了用Windows系统提供的定时器API写一个精确延时循环的方法。
问题原本是这个样子的,就是说,在一个循环中执行一些操作后,需要用Sleep这个函数,延迟一定时间后,在执行下一轮循环,伪代码如下:
for(int i = 0; i < MaxCount;i++)
{
dosomething();
Sleep(SleepTim
摘自geoogle search
2013年07月31日 12点07分 15
level 8
Pro_Batch 楼主
你注意到了,需要用Sleep这个函数,延迟一定时间,嗯?sleep这不正是我们想要的吗?
就用它!
2013年07月31日 12点07分 16
level 8
Pro_Batch 楼主
我们用geoogle搜索搜sleep api,居然搜出一大堆英文,这正是geoogle比百度牛逼之处我们点第一个,看到了么,msdn。
2013年07月31日 12点07分 17
level 8
Pro_Batch 楼主
首先移到syntax,查看它的函数原型
Syntax
C++
VOID WINAPI Sleep( _In_ DWORD dwMilliseconds );
你可能一下被吓晕了,前面的先不用管,还记得dword这个词么,如果不记得,到前面复习一下,那么dword对应着什么前缀呢,,对,就是;(英文分号)
2013年07月31日 12点07分 18
level 8
Pro_Batch 楼主
注意一下,函数原型里括号里是这个函数的参数,之间用英文逗号隔开,很显然,这个sleep函数只有一个参数,并且这个参数控制延时的时间
2013年07月31日 12点07分 19
level 8
Pro_Batch 楼主
把msdn向下拉,看到dll,把dll名字抄下来,kernel32.dll,这个dll经常要用到
2013年07月31日 12点07分 20
1 2 3 尾页