'Return the address of the specified ordinal method on the oCallback object, 1 = last private method, 2 = second last private method, etc
Private Function zAddressOf(ByVal oCallback As Object, ByVal nOrdinal As Long) As Long
' Note: used both in subclassing and hooking routines
Dim bSub As Byte 'Value we expect to find pointed at by a vTable method entry
Dim bVal As Byte
Dim nAddr As Long 'Address of the vTable
Dim i As Long 'Loop index
Dim J As Long 'Loop limit
RtlMoveMemory VarPtr(nAddr), ObjPtr(oCallback), 4 'Get the address of the callback object's instance
If Not zProbe(nAddr + &H1C, i, bSub) Then 'Probe for a Class method
If Not zProbe(nAddr + &H6F8, i, bSub) Then 'Probe for a Form method
' \\LaVolpe - Added propertypage offset
If Not zProbe(nAddr + &H710, i, bSub) Then 'Probe for a PropertyPage method
If Not zProbe(nAddr + &H7A4, i, bSub) Then 'Probe for a UserControl method
Exit Function 'Bail...
End If
End If
End If
End If
i = i + 4 'Bump to the next entry
J = i + 1024 'Set a reasonable limit, scan 256 vTable entries
Do While i < J
RtlMoveMemory VarPtr(nAddr), i, 4 'Get the address stored in this vTable entry
If IsBadCodePtr(nAddr) Then 'Is the entry an invalid code address?
RtlMoveMemory VarPtr(zAddressOf), i - (nOrdinal * 4), 4 'Return the specified vTable entry address
Exit Do 'Bad method signature, quit loop
End If
RtlMoveMemory VarPtr(bVal), nAddr, 1 'Get the byte pointed to by the vTable entry
If bVal <> bSub Then 'If the byte doesn't match the expected value...
RtlMoveMemory VarPtr(zAddressOf), i - (nOrdinal * 4), 4 'Return the specified vTable entry address
Exit Do 'Bad method signature, quit loop
End If
i = i + 4 'Next vTable entry
Loop
End Function
'Probe at the specified start address for a method signature
Private Function zProbe(ByVal nStart As Long, ByRef nMethod As Long, ByRef bSub As Byte) As Boolean
Dim bVal As Byte
Dim nAddr As Long
Dim nLimit As Long
Dim nEntry As Long
nAddr = nStart 'Start address
nLimit = nAddr + 32 'Probe eight entries
Do While nAddr < nLimit 'While we've not reached our probe depth
RtlMoveMemory VarPtr(nEntry), nAddr, 4 'Get the vTable entry
If nEntry <> 0 Then 'If not an implemented interface
RtlMoveMemory VarPtr(bVal), nEntry, 1 'Get the value pointed at by the vTable entry
If bVal = &H33 Or bVal = &HE9 Then 'Check for a native or pcode method signature
nMethod = nAddr 'Store the vTable entry
bSub = bVal 'Store the found method signature
zProbe = True 'Indicate success
Exit Do 'Return
End If
End If
nAddr = nAddr + 4 'Next vTable entry
Loop
End Function
分享到:
相关推荐
在Delphi编程中,"子类化"是一种技术,它允许你将一个现有的控件(如按钮)的行为和外观自定义到一个特定的程度。在这个场景中,"delphi子类化-重绘按钮源码"是指通过子类化Delphi的TButton组件,创建一个新的控件,...
System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { System.out.println(...
MFC 子类化机制详解 MFC 子类化机制是 Windows 编程中的一种重要技术,允许开发者自定义控件的行为,以满足特定的需求。在这篇文章中,我们将深入探讨 MFC 子类化机制的原理和实现方式,并提供一个实际的示例来...
子类 --静态初始化块 "); 34. } 35. 36. // 初始化块 37. { 38. System.out.println(s_Field); 39. System.out.println(" 子类 --初始化块 "); 40. } 41. 42. // 构造器 43. public SubClass() { 44. System.out....
那只能子类化了 之前有了解过一点点 这次的代码也基本参照的网上的源码 应该还有很多遗漏没写完整的 但是初步使用我觉得差不多 各路大神勿喷。源码里面的代码部分基本上按照我自己的理解带有解释。模块引用了:。1....
4. 子类--静态初始化块 5. 父类--变量 6. 父类--初始化块 7. 子类--变量 8. 子类--初始化块 9. 父类--构造器 10. 子类--构造器 这个输出揭示了在继承关系下类的初始化顺序: 1. **静态变量和静态初始化块**:首先...
在编程领域,子类化(Subclassing)和超类化(Superclassing)是面向对象编程中的两个重要概念,它们对于代码复用和模块化设计具有关键作用。本文将详细探讨这两种技术,并以MFC(Microsoft Foundation Classes)库...
在易语言中,窗口子类化是一个重要的技术概念,用于扩展或修改标准窗口的行为。本文将深入探讨窗口子类化在易语言中的应用及其相关知识点。 窗口子类化是一种Windows API技术,通过将一个窗口的原有消息处理函数...
2. 接着,执行子类的静态初始化块,打印出 "子类--静态变量" 和 "子类--静态初始化块"。 3. 然后,创建子类实例,首先执行父类的非静态初始化块,打印出 "父类--变量" 和 "父类--初始化块"。 4. 继续执行子类的非...
### 使用VB进行子类化 #### 一、何谓子类化(subclassing) 子类化(subclassing)是Windows编程中的一个重要概念和技术,尤其在使用Visual Basic (VB)进行开发时,它允许开发者对现有的窗口类进行扩展或修改其行为...
在这个“易语言源码易语言子类化自绘图片框源码.rar”压缩包中,包含了一个易语言编写的源代码示例,主要展示了如何实现子类化自绘图片框的功能。下面我们将详细探讨这个知识点。 1. **易语言**: 易语言是一种...
指针源码memory文件之-Ref-count-base与其子类-Ref-count和-Ref-count-resource
窗口过程子类化是Windows程序设计中的一个重要概念,它涉及到Windows消息处理机制。在易语言中,窗口过程子类化允许开发者扩展或修改已存在窗口的行为,以实现特定的功能需求。 首先,我们需要理解Windows窗口过程...
子类化 超类化 全局子类 学习C++过程中的几个练习
这个文件名表明该压缩包可能包含了一个使用Visual Studio 2008和Win32 SDK编写的示例项目,重点展示了如何处理按钮控件的WM_DRAWITEM消息和子类化。开发者可以在此基础上学习如何在Windows程序中创建、管理和自定义...
在编程领域,子类化是一种面向对象编程的概念,它允许我们创建一个新的类(子类)继承自现有的类(父类)。这种技术使得子类能够继承父类的属性和方法,并可以进行扩展或重写,以满足特定的需求。在这个场景中,...
【稳定精简子类化的软件源码】是一个关于Visual Basic(VB)编程的资源,它提供了稳定且优化的子类化技术实现。在VB编程中,子类化是一种常见的技术,用于扩展或修改已存在对象的功能,而无需直接修改原始类的代码。...
在VC++(Visual C++)编程环境中,子类化是一种常用的技术,用于扩展或自定义控件和窗口的行为。在标题“vc 子类化重绘界面代码”中,我们聚焦于如何通过子类化来改变Windows应用程序的界面显示。这通常涉及到创建一...
在Windows编程中,Win32 API提供了一种机制来改变窗口的行为,这称为窗口子类化(Window Subclassing)。窗口子类化允许开发者扩展或修改标准控件的功能,而无需从头创建自定义控件。这个过程涉及到注册一个新消息...