7,762
社区成员
发帖
与我相关
我的任务
分享
' *****************************************************************
' ** **
' ** 运用 【内联机器码 + 轻量级对象】 实现移位操作 **
' ** **
' ** - * - * - * - * - * - * - * - * - * - **
' ** 引用类型库: 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