使用ObjPtr(Me)返回自定义类实例的名称?

时间:2013-12-10 06:22:59

标签: excel vba excel-vba

我理解ObjPtr将返回内存中对象的地址,并且它指向一个名为IUNKNOWN的结构,并且有一种编码的接口定义用于公开Object结构,但我不能弄清楚如何确定VBA自定义类对象的接口以及如何使用它来返回对象的Name属性。

它比“必要”更“好”,但我只是想在运行时知道对象实例的名称,以便我可以将它包含在我的跟踪消息中。

任何人都可以解释如何做到这一点,或者更好地指导我参考,以便我能弄明白吗?

修改

重申我的目标:

创建一个能够找出其特定实例名称的自定义类对象。

例如

Dim oObject1 as Class1, oObject2 as Class1
Set oObject1 = New Class1
Set oObject2 = New Class1
Debug.Print oObject1.instanceName & " " & oObject2.instanceName

在即时窗口中:

oObject1 oObject2

这可以在VBA中使用吗?

如果VBA运行时有一个Symbol Table - 因为它是解释性的,我想也许它确实存在 - 而且我有办法暴露它,然后我可以创建一个Property Get过程来访问符号表并搜索Address - ObjPtr(Me) - 返回类实例的语义名称。

我很确定这是一个愚蠢的问题,但希望,实现其愚蠢问题的过程有助于我的理解。

符号表示例

Address Type    Name
00000020    a   T_BIT
00000040    a   F_BIT
00000080    a   I_BIT
20000004    t   irqvec
20000008    t   fiqvec
2000000c    t   InitReset
20000018    T   _main
20000024    t   End

2 个答案:

答案 0 :(得分:2)

NO为答题。在VBA中无法将实例名称​​作为String 文字返回。

我仍然不明白你可能想要这样做的原因......无论如何

了解每个实例代码名称的最简单方法是为存储实际名称的类创建属性。这只会将名称公开为String属性,而不是对象的实际引用 - 它已经有一个引用 - 本身!

所以创建一个类模块

<强>的Class1

Option Explicit

Public MyName as String

Module1 所需要的只是

Option Explicit

Sub Main()

    Dim c As Class1
    Set c = New Class1

    c.MyName = "c"

    Debug.Print c.MyName

End Sub

然后你去:)


另一种方法是创建一个Dictionary来存储KEY / VALUE对。

Sub Main()

    Dim c As Class1
    Set c = New Class1

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict.Add "c", c

    Debug.Print dict.Exists("c")

End Sub

现在,实际上可以做你想做的事,但这将是一种非常丑陋的方式。以下是我不打算演示的内容。

您将创建自定义类的实例。使用ObjPtr,你可以在内存中获得它的引用。然后,您需要一种逐行扫描模块代码的机制,并查找您已确定尺寸的所有变量的名称。一旦检索了所有变量的列表,就需要一种尝试来创建相同类型(类)的实例的机制。一旦超过该点,您可以通过编程方式尝试myNewObj = c“c”将是obj实例)。如果成功,那么你会为两者做ObjPt并在内存中匹配他们的地址 - 你得到一个你知道变量名称的匹配。 Grree请不要这样做:P

答案 1 :(得分:0)

TypeName(obj)将返回VBA中任何变量的类型:

Dim c as Class1
set c = new Class1 
Debug.print TypeName(c) '==> "Class1"

仅供参考,从历史上看,我也想访问符号表。想法是按名称从先前的作用域中获取局部变量。这样,您可以进行字符串插值:

a = "World"
Debug.Print StringInterp("Hello ${a}")

https://github.com/sancarn/VBA-STD-Library/blob/master/docs/VBAMemoryAnalysis.txt https://github.com/sancarn/VBA-STD-Library/blob/master/docs/VBAMemoryAnalysis2.txt

还没有运做一般的功能。