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

Coo*_*lue 5 excel vba excel-vba

我知道ObjPtr将返回一个对象在内存中的地址,并指向一个名为IUNKNOWN的结构,并且有一些接口定义编码在其中以暴露Object结构,但我无法弄清楚如何确定VBA自定义类对象的接口以及如何使用它来返回Object的Name属性.

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

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

编辑

重申我的目标:

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

例如

Dim oObject1 as Class1, oObject2 as Class1
Set oObject1 = New Class1
Set oObject2 = New Class1
Debug.Print oObject1.instanceName & " " & oObject2.instanceName
Run Code Online (Sandbox Code Playgroud)

在即时窗口中:

oObject1 oObject2
Run Code Online (Sandbox Code Playgroud)

这可能在VBA中吗?

如果VBA运行时有一个符号表 - 因为它是解释性的,我想也许它确实 - 并且我有一种暴露它的方法,然后我可以创建一个Property Get过程来访问符号表并搜索地址 - 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
Run Code Online (Sandbox Code Playgroud)

小智 2

寻求NO答案。在 VBA 中不可能将实例名称作为字符串文字返回。

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

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

所以创建一个类模块

1级

Option Explicit

Public MyName as String
Run Code Online (Sandbox Code Playgroud)

Module1中,所需要做的就是

Option Explicit

Sub Main()

    Dim c As Class1
    Set c = New Class1

    c.MyName = "c"

    Debug.Print c.MyName

End Sub
Run Code Online (Sandbox Code Playgroud)

就这样吧:)


另一种方法是创建一个字典来存储键/值对。

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,我还想到了 Name 属性解决方案...并且您描述的过程(不,不用担心,我不会去那里...)与编译器生成和管理的过程完全相反符号表。如果我能访问它,那就很容易了。哦,还有+1,这是编程史上最巧妙的解决方法...... (2认同)