Skip to content

(Default)模块

(Default)模块——内部称为_HiddenModule——汇集了编译器生成调用的未限定内联过程,这些过程也可以直接调用:原始内存辅助函数、原子操作、编译时反射、代码生成和栈检查原语,以及一大堆运行时实用工具。此模块的成员无需限定符即可引用,与MsgBoxCStr的使用方式相同。

这些过程大多有意对IntelliSense隐藏,仅在高级或低级场景下使用;仅当**MathStringsInformationInteraction**中的高级替代方案不适用时才使用。有几个还有此处未列出的仅限内部使用的成员。

指针函数ObjPtrStrPtrVarPtr以及Array构造函数记录在Information模块下;InputInputBWidth记录在FileSystem下。

读写内存

已知地址的内存使用GetMem*/PutMem*系列一次一个机器字地读取和写入——GetMem1GetMem2GetMem4GetMem8GetMemPtr用于读取,对应的PutMem1PutMem2PutMem4PutMem8PutMemPtr用于写入。vbaCopyBytesvbaCopyBytesZero移动块;AllocMemFreeMem管理堆分配。为这些辅助函数提供指针的构造函数——ObjPtrStrPtrVarPtr——位于Information中。

vb
Dim Buffer As LongPtr = AllocMem(16)
PutMem4 Buffer, &HDEADBEEF
Dim Magic As Long
GetMem4 Buffer, Magic
FreeMem Buffer

vbaRefVarAryvbaAryMove是在与C端数组布局交互时使用的低级辅助函数。

对象引用和转换

vbaObjAddrefvbaObjSetvbaObjSetAddref直接操作COM引用计数。vbaCastObj根据给定IID返回重新解释为另一个COM接口的对象。CreateGUID生成新的GUID并以注册表格式字符串返回。

原子操作

Interlocked*系列封装了对应的Windows内核原子操作——无锁计数器和指针交换的基础构建块:InterlockedExchangePointerInterlockedCompareExchangePointerInterlockedCompareExchange32InterlockedCompareExchange64InterlockedIncrement32InterlockedDecrement32

编译时反射

一些内联函数询问周围类型的问题而不运行任何东西;它们由编译器解析并作为常量嵌入。GetDeclaredTypeProgIdGetDeclaredTypeClsidGetDeclaredTypeIidGetDeclaredTypeEventIid报告类型的COM标识符。GetDeclaredMinEnumValueGetDeclaredMaxEnumValue返回已声明枚举的最小值和最大值。

代码生成注入和栈检查

EmitEmitAny将原始字节或类型化字面值拼接到封闭过程的代码生成输出中——内联汇编的载体。StackOffsetStackArgsSize报告当前调用点的布局信息;UnprotectedAccess返回绕过私有成员常规访问检查的对象引用。

运行时表达式求值

Eval编译并计算以字符串形式提供的twinBASIC表达式,使用配置了标准库绑定器的新构建的TbExpressionService

图片、位图和图标

PictureToByteArrayIPicture序列化为字节数组;CreateStdPictureFromHandle将GDI句柄包装在stdole.StdPicture中;ConvertIconToBitmap执行图标到位图的转换。

其他辅助函数

GetInheritedOwner返回控件的继承所有者对象。GetShortcutTextByEnum返回内置键盘快捷键的本地化显示文本。SetThreadGlobalErrorTrap注册一个回调,当未处理的运行时错误逃离调用线程上的活动错误处理程序链时触发。

成员

IGetMessageHook接口

IGetMessageHook接口钩入选定窗口——以及可选的其后代——的Windows消息流,并将选定类型的消息转发到用户提供的回调。使用RuntimeCreateGetMessageHook获取实例;使用RegisterMessage连接回调;然后调用Start激活所有已注册订阅,调用Stop移除订阅。

该接口直接继承自stdole.IUnknown(非基于分派),提供给RegisterMessage的回调类型为GetMessageHookHelper.GetMessageHandler

vb
Const WM_LBUTTONDOWN = &H201

Sub Demo()
    Dim Hook As IGetMessageHook = RuntimeCreateGetMessageHook
    Hook.RegisterMessage Me.hWnd, AllDescendants, _
                         WM_LBUTTONDOWN, AddressOf OnLButtonDown
    Hook.Start
End Sub

Function OnLButtonDown(ByRef msg As GetMessageHookHelper.HookMSG) As LongPtr
    Debug.Print "Click at"; msg.pt.x, msg.pt.y
    ' Return zero to let the message continue normal processing.
End Function

成员

  • RegisterMessage —— 为窗口和选定的后代范围订阅单个消息类型的回调
  • Start —— 激活所有已注册订阅
  • Stop —— 停用所有已注册订阅

EnumDescendantsModeFlags

选择传递给RegisterMessage的窗口范围:

常量描述
ExactWindow1仅钩住指定窗口。
AllDescendants2钩住指定窗口及所有后代——子级、孙级等。
DirectChildren4仅钩住指定窗口及其直接子级。

GetMessageHookHelper模块

GetMessageHookHelper模块是IGetMessageHook的小型伴随模块,包含其回调使用的结构和委托类型。无需构造任何内容;这些名称仅用于声明。

HookMSG

Windows MSG结构的副本,按引用传递给GetMessageHandler回调。

vb
Type HookMSG
    hwnd As LongPtr             ' Window the message is destined for.
    message As Long             ' The WM_* identifier.
    wParam As LongPtr           ' Message-specific parameter.
    lParam As LongPtr           ' Message-specific parameter.
    time As Long                ' Time the message was posted, in milliseconds since system start.
    pt As HookPOINT             ' Cursor position when the message was posted.
End Type

HookPOINT

具有Long坐标的2D点,HookMSG使用它来保存光标位置。

vb
Type HookPOINT
    x As Long
    y As Long
End Type

GetMessageHandler

IGetMessageHook.RegisterMessage接受的回调签名。返回零通常让消息继续正常处理。

vb
Public Delegate Function GetMessageHandler (ByRef msg As HookMSG) As LongPtr

twinBASIC及其LOGO版权为作者"韦恩"所有