【源码】无聊……发份源码:VB6运用 【内联汇编代码 + 轻量级COM对象】 实现的移位操作

舉杯邀明月 2018-02-04 06:40:15
  在VB6中实现的“移位操作”,可能大家在网上也看到了不少的代码。不过,大多数实现方法都是运行效率极低的。当
然,也有一些“好点”的代码,可惜要么只能在编译后有效(在IDE环境中运行仍然用的“算术运算”模拟的),要么实现方
法比较繁琐(要用到几个 Virtual**** 系列的API ,看到这些API我就担心“意外”导致失败)。
  我这儿说的“内联汇编代码”严格说来是不恰当的,只是多数人都习惯这样说而已。术语应该是叫“Thunk Code”。
不过,这个问题不是重点,我没必要讨论如何“称呼”更准确,纠结这些没有实质意义。
  在这儿,我公布一份实现简单、运行高效的代码。无论在IDE中,还是在编译后,都是执行“硬件操作指令”进行移位
操作的,总体来说比在VB6中用“算术运算模拟”要快好几十倍。
  代码很简短,在“原理”方面没什么好“解释”的。有足够知识的,自然看得懂是怎么回事;看不懂的也没关系,只
要在“用得上的地方”会正确使用就行了,并不是非要知道原理才行。
  移位操作函数总共是8个,具体的可以阅读一下我前一次发的关于移位操作的帖子,在这儿就不多说了。函数的入口参
数用Long类型,我是出于“适应性最广”的考虑,并且我发觉函数参数“传4字节”似乎并没有比传2字节或1字节慢。所有
接口函数的“参数说明”,其实我都是有注释的,聪明的人一定能看到,呵呵……
  接口模块定义如下:
' *****************************************************************
' ** **
' ** 运用 【内联机器码 + 轻量级对象】 实现移位操作 **
' ** **
' ** - * - * - * - * - * - * - * - * - * - **
' ** 引用类型库: VB6移位操作接口对象库 ( BitLib.tlb ) **
' *****************************************************************
' 源码创作: Chen8013 〖 (C)版权所有 〗
' E-mail : Gem8013@qq.com
' 发布日期: 2018年2月4日
'
' 使用说明:
' ⑴ 工程必须“引用”类型库 BitLib.tlb ,否则不能运行、不能编译。
' ⑵ 先调用一次 CreateIBit() 过程(一般在“程序入口”处调用)。
' 此过程只需要调用一次即可(反复“调用”也没问题),理论上不会失败。
' ⑶ 需要进行“移位操作”的地方,通过 IBit 对象来调用相应的操作函数。
' ⑷ 移位操作函数的入口参数,都是 ByVal传递的;函数返回值为操作结果。
Option Explicit


' ==============================
' ≡ API 函 数 声 明 ≡
' ==============================
Private Declare Sub PutMem4 Lib "MSVBVM60" (pDest As Any, ByVal NewVal As Long)


' ==============================
' ≡ 自定义 数据类型 ≡
' ==============================
Private Type ObjData ' 定制轻量级“对象核心数据”
pVTable As Long
cRefs As Long
End Type

Private Type LW_VTable ' 定制轻量级“对象虚函数表”
fpIUnknown As Long
fpAddRef As Long
fpRelease As Long
LongSHL As Long
LongSHR As Long
LongROL As Long
LongROR As Long
IntSHL As Long
IntSHR As Long
IntROL As Long
IntROR As Long
uReserved As Long ' 保留成员(未用)
End Type

Private Type ASM_Code
ASM(0 To 3) As Long
End Type


' ==============================
' ≡ 常量 & 变量 声明 ≡
' ==============================
Private m_VTable As LW_VTable ' 仿制“虚函数表”
Private m_Object As ObjData ' 仿制“对象数据”
Private m_COM_StdFun As ASM_Code ' 标准接口函数代码
Private m_CodeLongSHL As ASM_Code
Private m_CodeLongSHR As ASM_Code
Private m_CodeLongROL As ASM_Code
Private m_CodeLongROR As ASM_Code
Private m_CodeIntSHL As ASM_Code
Private m_CodeIntSHR As ASM_Code
Private m_CodeIntROL As ASM_Code
Private m_CodeIntROR As ASM_Code
Private m_InitFlag As Long
'
' * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Public IBit As IBit ' 全局对象变量:公用移位操作接口对象
' * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *



' ==============================
' ≡ 公 共 接 口 函 数 ≡
' ==============================
Public Sub CreateIBit()
' 创建“移位操作接口对象”:理论上肯定成功
Dim stcASM As ASM_Code

' …………(略)详见下图…………
End Sub


  核心代码就1个标准模块+1个tlb文件。现在CSDN的资源都不免费了,我也就不用资源的方式来上传了。下面的这张图
片中,包含了一个简单的示例工程(接口模块和tlb文件自然也在其中),把图片“另存为……”xxx.rar文件,就可以用
WinRAR(或其它支持的软件)打开解压了。


  大家可以看到,这个代码很简短、精巧吧! 
  创建的COM对象,占用的全部空间还没200字节(这个“模块”的代码空间不算在内),够“轻”的吧!
  并且,你即使在IDE中直接点“停止”工具按钮终止程序,也不会有“内存泄漏”的问题。
...全文
1188 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
vansoft 2018-04-24
  • 打赏
  • 举报
回复
太高级了,反正我是没看懂。
  • 打赏
  • 举报
回复
我电脑上没有250的软件,只有360. 下次我要注册一个WWW.250.COM,然后上传很多软件上去,欢迎大家到我的250网站下载工具
笨狗先飞 2018-04-19
  • 打赏
  • 举报
回复
引用 29 楼 Chen8013 的回复:
[quote=引用 28 楼 bakw 的回复:] [quote=引用 27 楼 xiaoyao961 的回复:] 我电脑上没有250的软件,只有360. 下次我要注册一个WWW.250.COM,然后上传很多软件上去,欢迎大家到我的250网站下载工具
这种域名很贵,怕是买不起吧[/quote] 一级域名,肯定很贵的。 [/quote] 三字域名都很贵,注册商自己都会去加价卖,四字域名有时候捡个漏还有便宜的
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
引用 28 楼 bakw 的回复:
[quote=引用 27 楼 xiaoyao961 的回复:] 我电脑上没有250的软件,只有360. 下次我要注册一个WWW.250.COM,然后上传很多软件上去,欢迎大家到我的250网站下载工具
这种域名很贵,怕是买不起吧[/quote] 一级域名,肯定很贵的。
笨狗先飞 2018-04-19
  • 打赏
  • 举报
回复
引用 27 楼 xiaoyao961 的回复:
我电脑上没有250的软件,只有360. 下次我要注册一个WWW.250.COM,然后上传很多软件上去,欢迎大家到我的250网站下载工具
这种域名很贵,怕是买不起吧
  • 打赏
  • 举报
回复
引用 13 楼 hsgzr1 的回复:
我想测试下 你的代码咋样,看了下,你的代码发的不全呀
按楼主说的,将图片另存为rar,确实可以解压。
舉杯邀明月 2018-04-18
  • 打赏
  • 举报
回复
引用 25 楼 jlmugua 的回复:
[quote=引用 13 楼 hsgzr1 的回复:] 我想测试下 你的代码咋样,看了下,你的代码发的不全呀
按楼主说的,将图片另存为rar,确实可以解压。[/quote] 呵呵,海鸥软件(hsgzr1)开始用的压缩软件是数字流氓的,   那个破软件确实打不开我那个“特殊处理的压缩文档”(看到 hsgzr1 的回复后才下载来试的)。 我从来不用250的东西,不知道会发生这种事。他认为我在“乱说”,这也不怪他。 
舉杯邀明月 2018-03-10
  • 打赏
  • 举报
回复
引用 22 楼 hsgzr1 的回复:
舉杯邀明月 对不起是我错啦 我真不知道图片可以下载压缩文件,我下载后是默认360压缩解压的 360确实是打不开,我今天查了一下,原来是将图片和压缩文件再使用copy二进制方式压缩后改成图片名即可,可是为什么下载后改成rar,就是正常的rar文件,那个压缩进来的图片不会对rar文件造成破坏呢?
刚才特意试了一下:二百五压缩确实不能打开。 但是如果用的是 WinRAR,或者“好压”(2345软件的),是能正常识别的。 这种文档有某些压缩软件“不能识别”的问题,我确实没有太在意。 因为我的电脑中的压缩软件只有WinRAR(最常用)和cab压缩(极少使用),   尤其是数字流氓的软件,都是被我“拒绝”的,因此有“不能识别”的问题,算是个意外吧。 这种“特殊处理”的文档,能不能被压缩软件识别, 我猜想(因为没有去“探索”它们的实现细节)主要是跟“引擎”的程序编写有关吧。 如果它只是“简单的识别一下”,这种“非标准”的文档就肯定被认为是“不合法的压缩文档”了; 而那些“能够识别”的软件,应该是它进行了“仔细盘查”的原因吧。
橘子皮... 2018-03-09
  • 打赏
  • 举报
回复
引用 18 楼 hsgzr1 的回复:
将一张png的图保存成rar文件,就成了rar文件啦?我都觉得可笑,可笑你还是做程序开发的
孤陋寡闻
海鸥软件 2018-03-09
  • 打赏
  • 举报
回复
对不起大家,真是三人行必有我师,二十年的开发人员却不知道这个,羞愧
海鸥软件 2018-03-09
  • 打赏
  • 举报
回复
舉杯邀明月 对不起是我错啦 我真不知道图片可以下载压缩文件,我下载后是默认360压缩解压的 360确实是打不开,我今天查了一下,原来是将图片和压缩文件再使用copy二进制方式压缩后改成图片名即可,可是为什么下载后改成rar,就是正常的rar文件,那个压缩进来的图片不会对rar文件造成破坏呢?
  • 打赏
  • 举报
回复
比不用汇编 效率应该高不少
舉杯邀明月 2018-03-08
  • 打赏
  • 举报
回复
引用 13 楼 hsgzr1 的回复:
我想测试下 你的代码咋样,看了下,你的代码发的不全呀
你认真看了我的帖子吗? 在我的主贴后面部分,插入了一张图片, 把那个图片保存到你的的电脑中、再把扩展名改为“rar”(WinRAR压缩文档), 就可以用相应的软件打开解压了。 (我在主贴中已经说清楚了的)
舉杯邀明月 2018-03-08
  • 打赏
  • 举报
回复
引用 13 楼 hsgzr1 的回复:
我想测试下 你的代码咋样,看了下,你的代码发的不全呀
乱说! 我的代码(含“简单应用示例”工程)都发出来了,还敢说我的“代码不全”???
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
我想测试下 你的代码咋样,看了下,你的代码发的不全呀
舉杯邀明月 2018-03-08
  • 打赏
  • 举报
回复
引用 18 楼 hsgzr1 的回复:
将一张png的图保存成rar文件,就成了rar文件啦?我都觉得可笑,可笑你还是做程序开发的
呵呵,可笑? 看到你这么无知,我也不想说什么了…………
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
将一张png的图保存成rar文件,就成了rar文件啦?我都觉得可笑,可笑你还是做程序开发的
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
你根本就没有文件连接,只是一张图片面已
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
引用 15 楼 Chen8013 的回复:
[quote=引用 13 楼 hsgzr1 的回复:] 我想测试下 你的代码咋样,看了下,你的代码发的不全呀
你认真看了我的帖子吗? 在我的主贴后面部分,插入了一张图片, 把那个图片保存到你的的电脑中、再把扩展名改为“rar”(WinRAR压缩文档), 就可以用相应的软件打开解压了。 (我在主贴中已经说清楚了的) [/quote]你试试你的图片能保存成rar文件吗?保存成rar文件,你试试是rar文件吗?只是将png图片改成了rar后缀
舉杯邀明月 2018-02-05
  • 打赏
  • 举报
回复
引用 7 楼 chewinggum 的回复:
有可能后面要做循环位移、128位位移之类的……
这跟我的代码能扯上关系啊!  我的代码是有16位和32位的左移、右移(逻辑右移)、循环移位(左和右)接口的。 你要想操作“超过32Bit”的数据,32位程序本身就不支持。 无论如何你都得“另外实现”操作接口的。 况且,直接用我这个“移位操作接口”组合出64位、128位的移位操作,肯定也比你用其它方法来“实现组合”的运行效率高啊。
加载更多回复(11)
学习并掌握C++2.0(11+14+17+20)的新特性,学习线程及线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、多线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11新特性 41). nullptr关键字与新语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 新增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28多线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转左值 3412). constexpr 35第2章 C++14新特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17新特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更新镜像 42更新软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20新特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,新增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0多线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程与线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程和多线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧