【源码】无聊……发份源码: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中直接点“停止”工具按钮终止程序,也不会有“内存泄漏”的问题。
...全文
1181 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)

7,762

社区成员

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

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