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

我明白, ObjPtr将返回一个对象在内存中的地址,并指向一个名为IUNKNOWN的结构,并且有一些types的接口定义编码,以暴露对象结构,但我不知道如何确定VBA定制类对象的接口以及如何使用它返回对象的名称属性。

拥有“比”基本“更”高兴“,但我只想在运行时知道对象实例的名称,以便将其包含在跟踪消息中。

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

编辑

重申我的目标:

使自定义类对象能够找出其特定实例的名称。

例如

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运行时有一个符号表 – 因为它是解释性的,我认为也许它 – 并且我有一个方法公开它,然后我可以做一个Property Get过程来访问符号表和searchAddress – 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 

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

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

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

所以创build一个类模块

1类

 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 

在那里你去:)


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

 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 

现在,可以真正做你想做的事情,但这将是一个非常丑陋的方式。 以下是我不打算演示的方式。

您将创build一个自定义类的实例。 使用ObjPtr你可以得到它在内存中的引用。 然后,您需要一个机制,逐行扫描您的模块代码,并find所有variables的名称。 一旦你检索到所有variables的列表,你将需要一个机制, 试图创build一个相同types(类)的实例。 一旦你通过这一点,你可以尝试以myNewObj = c“c”将是obj实例 )。 如果成功了,那么你会为它们做ObjPt并在内存中匹配它们的地址 – 你得到一个匹配你知道variables名称。 Grree请不要那样做:P