gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:32:09 25 4
gpt4 key购买 nike

据我了解 ObjPtr将返回内存中对象的地址,并且它指向一个名为 IUNKNOWN 的结构,并且其中编码了某种接口(interface)定义以公开对象结构,但我不知道如何确定一个对象的接口(interface)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 过程来访问符号表并搜索地址 - 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 属性,而不是对对象的实际引用 - 它本身已经有一个引用!

因此创建一个类模块

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

就这样吧:)

<小时/>

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

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

关于excel - 使用 ObjPtr(Me) 返回自定义类实例的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com