Reflection 如何在VB6中以编程方式列出对象的属性?

Reflection 如何在VB6中以编程方式列出对象的属性?,reflection,vb6,Reflection,Vb6,我的一个朋友正在做一个遗留的VB6项目。我已经十年没有接触过那种语言了,所以我已经很生疏了。无论如何,VB6是否有任何类型的反射API?具体来说,他需要一种迭代用户创建的类的属性(和类型)的方法。(换句话说,不是一个外部COM对象,而是一个内部的“类模块” 如何做到这一点?这就是您要寻找的东西: 我们在这里讨论了这个问题,所以: 我自己从来没有尝试过这种东西。如果您的项目是ActiveX(ActiveX EXE、DLL或OCX,而不是标准EXE),并且如果类是公共的,那么Jay是一种选择 但是

我的一个朋友正在做一个遗留的VB6项目。我已经十年没有接触过那种语言了,所以我已经很生疏了。无论如何,VB6是否有任何类型的反射API?具体来说,他需要一种迭代用户创建的类的属性(和类型)的方法。(换句话说,不是一个外部COM对象,而是一个内部的“类模块”


如何做到这一点?

这就是您要寻找的东西:

我们在这里讨论了这个问题,所以:

我自己从来没有尝试过这种东西。

如果您的项目是ActiveX(ActiveX EXE、DLL或OCX,而不是标准EXE),并且如果类是公共的,那么Jay是一种选择

但是,您提到您的朋友希望使用“内部类模块”来实现这一点。我不确定您是指私有
.cls
文件(类)还是
.bas
文件(模块),但无论哪种方式,您都只能使用TypeLib信息对象库来反映公共类、用户定义的类型、常量或枚举

不能使用库来反映模块、私有类或任何其他声明为私有的内容

根据一般经验,在查看其他项目的项目内容时,只能对对象浏览器中可以看到的内容使用反射。也就是说,如果编译项目,创建新项目,将第一个项目添加为引用,然后在对象浏览器中查看第一个项目的内容,则可以通过TypeLib信息对象库访问在对象浏览器中看到的任何内容。如果对象浏览器中未列出某些内容,则您将无法使用TypeLib信息对象库来反映它


VB6没有任何对运行时反射或内省的内置支持。使用TypeLib信息对象库进行反射适用于ActiveX VB6项目,因为ActiveX项目是在具有嵌入式类型库的COM组件中编译的,但如上所述,您只能访问在编译组件的类型库中公开的数据类型。使用对象浏览器可以快速确定类型库中的内容,因为只要从单独的项目中查看零部件的内容,对象浏览器实际上会检查零部件的类型库以填充您在对象浏览器中看到的内容(如果从组件自己的VB6项目查看组件,它将显示公共和私有数据结构,即IDE中可见的所有内容).

TypeLib信息对象库的功能非常好。我们使用它在应用程序启动时动态查找和加载实现公共
IPlugin
接口的插件类。但是,由于OP提到了私有的内部类,除非他公开这些类并将它们作为COM对象公开,否则他就倒霉了(通过使用ActiveX类型项目)。TypeLib库本身对VB6一无所知:它是为检查COM类型库而设计的。我不太确定您不能为此使用TLI。这些私有类等只是父程序本身的一部分,并在IDE的对象浏览器中显示(使用TLI本身)。问题是这些信息是否存储在已编译的程序中,并且在运行时可从EXE获得。唉-似乎标准EXE不保存任何类型信息。糟糕。@Bob:对象浏览器可能会误导用户。它大部分时间都使用TLI,但如果在IDE中打开Project ABC并在对象浏览器中查看ABC的内容,它将我将显示除公共内容外的所有私有类和模块。此外,标准EXE根本不包含任何类型库信息。类型库是COM组件,因此它们仅适用于VB6中的ActiveX类型项目。要确切了解给定VB6组件通过TLI可访问的内容,更精确的方法是使用OLE View rat她比对象浏览器要好,但你必须知道如何读取MIDL。原因是OLE View会准确地向你显示COM所公开的内容,因为它直接读取组件的类型库。这正是我所怀疑的,我自己是一个COM老家伙,对类型库、IDispatch等非常熟悉。不幸的是y、 我的朋友没有把他的类分成另一个项目的奢侈,因为这个古老的遗留应用程序的编写方式令人震惊。(UI的状态和“对象”紧密地交织在一起。)我为你的朋友感到难过。这个系统听起来很痛苦。