[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 45# defanive


    跳到自定义函数后ret? 求解释啊

TOP

回复 46# garyng
嗯都是这样的,不是么
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 47# defanive


    我用的是笨方法啊,又学一招了,谢谢!

TOP

求助一下这种方式为何内存会出现读取错误?
  1. @echo off
  2. ..\CAPI
  3. set CAPI=COM Init
  4. set CAPI=COM Create InternetExplorer.Application
  5. set obj=%CAPI_Ret%
  6. set CAPI=COM Method %obj% Navigate $about:blank
  7. set CAPI=COM PUT %obj% Visible ;1"
复制代码
执行obj.navigate("about:blank")时内存出错

TOP

回复 49# 3dnowex
这个比较奇怪,我试了一下,IE对象的其他方法和属性调用都正常
但是Navigate和Navigate2调用会导致崩溃
原因暂时不明,正在研究中
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 50# defanive
在想bat是否能联合vbs通过这种方法做界面。
capi如果能自带一个调用函数,把其地址传给RegisterClass的参量WNDCLASS的lpfnWndProc,系统执行这个窗口消息处理函数的时候即跳入capi的内函数,capi开一个cmd新线程,将主动权bat指定的函数,执行到goto :EOF再次返回capi的内函数随后返回系统←不知这样是否可行呢?

TOP

回复 51# 3dnowex
这正是我在开发手记里面说的那个想法,结果是失败了
一切都做得很正常,但是唯一的问题在于,新线程返回到旧的执行点的时候,会有问题
CMD不是用独立的内存保存批处理代码执行位置的,也就是说新线程的批处理代码执行位置会把旧线程的位置代替掉
所以说杯具了,尽管调用了新线程,但是没办法返回到之前执行的位置
PS 有另外一个新想法,正在试验中
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

本帖最后由 netbenton 于 2012-10-13 11:56 编辑

有个提议,语法能不改成这样:
set /capi 返回变量名1=[功能] [参数1] [参数2]…… [参数N]<行结束符>  返回变量名2=[功能] [参数1] [参数2]…… [参数N]<行结束符>   返回变量名3=[功能] [参数1] [参数2]…… [参数N]<行结束符> …………返回变量名N=[功能] [参数1] [参数2]…… [参数N]<行结束符>

PS:
1.也就是返回值直接存到指定变量,并且,一个set /capi 执行了多行capi命令~;
这样不但可以提速,有些情况还可以免受干扰,对需要多个api调用才能成完成的功能,更是有利
甚至“返回变量名2” 做成可以直接是用户的内存地址,即有些临时的api调用,没必要存到cmd 的环境变量。

2.如果某个调用语句很长时用变量,拼接法即可:

set 语句= 返回变量名1=[功能] [参数1] [参数2]…… [参数N]<行结束符>
set 语句=%语句% 返回变量名2=[功能] [参数1] [参数2]…… [参数N]<行结束符>
set 语句=%语句% 返回变量名3=[功能] [参数1] [参数2]…… [参数N]<行结束符>
……
set /capi %语句% 返回变量名N=[功能] [参数1] [参数2]…… [参数N]<行结束符>

TOP

netbenton的想法很好的说,但是如果set 的字串太多,也会影响效率的吧

TOP

回复 53# netbenton
我很喜欢返回变量名的想法,但是暂时似乎没有办法做到
set语句的处理是在cmd内部进行的,处理完最后再调用SetEnvironmentVariableW
所以除非有办法找到处理set的代码位置,不然都没办法做任何处理
对于多行命令同时执行的话,我认为没什么必要
这种多个命令同时执行是普通第三方遗留下来的传统
普通的第三方是启动新进程,因此启动进程的时间远远大于实际执行代码的时间
所以说把多行代码合并在一起就可以省去启动进程的时间
但是CAPI是基于注入的,所以说实际上跳转到钩子函数的耗时基本上非常少(我本机测试,20000条set命令,加了钩子只比不加钩子慢了0.06s)
所以说这样对速度的提升并没有很显著的效果
直接set CAPI=xxx&set CAPI=yyy基本上就可以做到一样了(虽然看起来稍微难看一点)
返回变量名是一个很好的想法,以为很直接的省去了set xxx=%CAPI_Ret%这一行命令
但是杯具的是貌似没办法做成set /CAPI ret_var=xxx的语法
最多可以做成set CAPI=ret_var xxx,但是这样大改语法结构了
总之谢谢建议,对于CAPI的语法调用问题我还是觉得很蛋疼,已经尽量尝试做到最好了
目前大致的结构是set CAPI=[主类] [子类] [标识符][参数1] [标识符][参数2] ...
将命令分成主类和子类是为了减少程序员的记忆量,也让代码容易阅读
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 55# defanive
新手od断ReadConsole跟了下XP的cmd.exe下运行set /a,发现进入到4AD05A42处的内函数中有个字符串的比较(/a /p),这里是否能做些手脚实现set /capi或者set /c这样的功能呢?

TOP

回复 56# 3dnowex
麻烦的在于不同版本的cmd函数地址也不一样,不方便做判断
cmd没有一个开放给外界的接口,很蛋疼 = =
感觉走到最后都只能走回API Hook的路上
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

更新:1.2, Build 1D910, x32
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

强!!
之前看到你的CAPI,就希望谁能做个 注入版,没想到真出来了
而且这么强大!!

TOP

.很强大 ...有没有开源.
非常批处理3群:56794763
有偿写程序.
批处理, lua, c, c++, vba, php, css

TOP

返回列表