2010-07-13 12 views
0

J'essaie de créer une bibliothèque de classes COM pour mon projet VBA et l'une des limitations que j'ai semblé avoir rencontrées est l'utilisation de constructeurs sur le sous-programme New() . Après avoir créé la nouvelle classe COM un Sub New Public() est créé avec les commentaires suivantsUtilisation de constructeurs sur le Sub New() pour un CCW

' A creatable COM class must have a Public Sub New() 
' with no parameters, otherwise, the class will not be 
' registered in the COM registry and cannot be created 
' via CreateObject. 

Il est évident que si je veux créer plus avec le nouveau sous-routines mot-clé qui permettent différents paramètres. Cependant, quand j'essaye de faire ceci et d'implémenter les objets dans VBA j'obtiens une erreur en essayant d'entrer les paramètres en disant "Fin de l'instruction prévue". Si quelqu'un a des informations qui seraient grandement appréciées.

Merci.

Répondre

2

Toutes les classes exposées à COM doivent avoir un constructeur-période sans paramètre. La raison en est que lorsque le client instancie une classe, l'appel passe finalement à la fonction globale CoCreateInstance() (ou IClassFactory::CreateInstance() qui est presque la même chose). CoCreateInstance() (ou IClassFactory::CreateInstance()) n'ont aucun moyen de transmettre des paramètres dans le constructeur de la classe afin que la classe doit avoir un constructeur sans paremeter - ce constructeur sera utilisé pour instancier la classe en interne.

Si vous avez besoin de plus d'un constructeur sans paremeter - utilisez une classe de fabrique. Pseudocode:

// this should be made COM-exposed 
interface IYourClassInterface { 
}; 

// this should not be made COM-exposed 
class CYourClass { 
public: 
    CYourClass(parameters) {} 
}; 

class CYourClassFactory { 
public: 
    CYourClassFactory() {} //<- parameterless constructor 
    IYouClassInterface* CreateInstance(parameters here) 
    { 
     return new CYourClass(); 
    } 
}; 

De cette façon, vous avez une classe de fabrique avec un constructeur sans paremeter. Vous instanciez l'usine, puis appelez sa méthode de création pour instancier votre classe.