我写了一个工程是ActiveX dll类型的,但是运行时出现如下问题:没有检测可创建的公有类模块。按 F1 键以获取多的信息
ActiveX EXE, ActiveX DLL 以及 ActiveX 控件这些工程类型,需要至少一个公有的可创建的类模块。我想知道什么是可创建的公有类模块?怎么解决以上这个问题?

解决方案 »

  1.   

    把可在外部访问的类的Instancing属性改成5-MultiUse
      

  2.   

    From NSDN:
    Instancing 属性设置一个值,确定能否在工程之外创建公共类的实例。如果可以,如何实现。运行时无效。Instancing 属性设置如下:设置 描述 
    1 (缺省)私有。不允许其它应用程序访问关于类的类型库信息,也不能创建该类的实例。私有对象只能在自己的部件中使用。 
    工程类型不同,实例属性缺省也不同。只有对于Standard Exe工程中的类模块,私有才是缺省的。当在 ActiveX Exe 工程或ActiveX DLL工程中插入一个新的类模块时,Instancing 属性的缺省值是 MultiUse。当在 ActiveX 控件工程中插入一个新的类模块时,Instancing 属性的缺省值是 PublicNotCreatable。
     
    2 PublicNotCreatable。只有在自己的部件首先创建了对象的前提下,其它应用程序才能应用此类的对象。不能用 CreateObject 函数或 New 操作符来创建类对象。 
    3 SingleUse。允许其它应用程序从这个类创建对象,但客户创建的该类的每个对象都启动部件的一个新的实例。在 ActiveX DLL 工程中是不允许的。 
    4 GlobalSingleUse。类似于 SingleUse ,除了此类的各种属性和方法可以象简单的全局函数那样被调用。在 ActiveX DLL 工程中是不允许的。 
    5 MultiUse。允许其它应用程序从这个类创建对象。部件的一个实例可提供按此方式创建的任意数目的对象。 
    6 GlobalMultiUse。类似于 MultiUse,只附加了一点:这个类的各种属性和方法可以象简单的全局函数那样被调用。该类的实例不需要显式创建,因为它会自动创建。 设置                  应用的工程类型 
                          ActiveX Exe ActiveX DLL ActiveX Contol Std. Exe 
    Private               X                 X             X          X 
    PublicNotCreatable    X                 X             X   
    SingleUse             X       
    GlobalSingleUse       X       
    MultiUse              X                 X     
    GlobalMultiUse        X                 X 
    说明在 Visual Basic 5.0 里,Instancing 属性应用于 Class 模块,并得到扩展,以便与 Visual Basic 4.0 Public 属性的功能合并在一起。如果类是可创建的,从其它应用程序创建该类的实例,可用下面的任何一种技术: 用 CreateObject 函数,如: 
    Set MyInstance = CreateObject("MyProject.MyClass")在同一工程里(或当 Public 属性设为 True 时,在工程之外)用 Dim 语句,如: 
    Dim MyInstance As New MyClass关键字 New 表明 MyInstance 被声明为 MyClass 的一个新实例。如果 Public 属性为 False,则 Instancing 属性被忽略。总可以在定义该类的工程内创建类实例。如果 Public 属性为 True,则此类可视。因此一旦该类的实例存在,那么它是能受控于其它应用程序的。注意 GlobalMultiUse 对象的各种属性和方法,不是提供对象的部件的全局名空间的一部分。例如,在包含 GlobalUtility 类模块的工程内部,为了使用这个对象的各种属性和方法,必须显式创建 GlobalUtility 的实例。全局对象的其它限制,列在“部件工具指南”的“编译代码部件”的“全局对象和代码库”中。
      

  3.   

    VB 的 ActiveX dll 是 COM 组件,必须通过对象进行调用,所以必须有公共类模块。
    察看类的属性页(F4),里面的Instancing属性
    1:私有,外部不可见,也就无法调用
    2:公共不可创建,通常用做其他类的属性、集合的成员
    5:公共,最常用的类型
    6:公共全局,在 5 的基础上多一个特性,会自动创建一个同名的实例,比如 VB 中的 App 对象