cmdex,ex即extension。之所以说超越capi,是因为capi有很多缺陷:
- 作者按照自己的想法对cmd进行扩展,但没有提供额外的扩展空间。
- 语法晦涩难懂,难以使用,也背离了bat作为脚本的简洁性。
- 借助于set命令,只能作为二等公民。
- 兼容性差,注入的方式容易被误杀。
而cmdex虽然不直接提供扩展的命令,但提供了用于扩展的接口,使每个人都能定义自己的cmd。
特性:
- 提供像内置命令一样的调用方式,命令执行的优先级仅次于cmd内置命令和“cmdex”(预设命令),高于外部程序。
- 直接提供命令字和上一行命令(可能包含多条命令或不足一条命令)供处理,提供最大的自由度。
- >,<,>>等重定向一般不需要自行处理(未充分测试)。
扩展方式:
程序启动时加载所在目录的ext.dll,并调用其导出的ExtCallBack函数,参数含义可自行测试,例子如下:- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
-
- #define DLL_EXPORT __declspec(dllexport)
-
- #define HANDLED 0
- #define UNHANDLED 1
-
- #ifdef __cplusplus
- extern "C"
- {
- #endif
-
- int DLL_EXPORT ExtCallBack(const wchar_t * cmd, const wchar_t * cmdline);
-
- #ifdef __cplusplus
- }
- #endif
- wchar_t * mycmd = L"mycmd";
-
- int DLL_EXPORT ExtCallBack(const wchar_t * cmd, const wchar_t * cmdline)
- {
- if(wcsnicmp(cmd, mycmd, wcslen(mycmd)) == 0)
- {
- wprintf(L"cmd:%s\n", cmd);
- wprintf(L"lastcmdline:%s\n", cmdline);
- fflush(stdout);
- return HANDLED;//命令已处理
- }
- return UNHANDLED;//命令未处理,继续查找外部程序
- }
复制代码 用法随你喜欢,可以简单的添加命令,甚至可以做成一个插件管理器,把常用的第三方做成动态库供加载使用。
附件是程序本体和例子编译成的dll。
链接: https://pan.baidu.com/s/1RB4-lLK4z26I_NT3Wz9Kyg 提取码: schc |