Использование конструкторов в Sub New () для CCW - PullRequest
0 голосов
/ 13 июля 2010

Я пытаюсь создать библиотеку классов COM для моего проекта VBA, и одно из ограничений, с которыми я столкнулся, заключается в использовании конструкторов в функции New (). После создания нового класса COM создается Public Sub New () со следующими комментариями

' 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.

Очевидно, что я хочу создать больше подпрограмм с новым ключевым словом, которое учитывает различные параметры. Однако, когда я пытаюсь сделать это и реализовать объекты в VBA, я получаю сообщение об ошибке при попытке ввести параметры, говорящие «Ожидается конец оператора». Если у кого-то есть какая-либо информация, которая будет принята с благодарностью.

Спасибо.

1 Ответ

2 голосов
/ 14 июля 2010

Все классы, открытые для COM, должны иметь конструктор без параметров - точка.Причина в том, что когда клиент создает экземпляр класса, вызов в конечном итоге переходит в CoCreateInstance() глобальную функцию (или IClassFactory::CreateInstance(), что почти совпадает).CoCreateInstance() (или IClassFactory::CreateInstance()) не имеют средств для передачи параметров в конструктор класса, поэтому у класса должен быть конструктор без параметров - этот конструктор будет использоваться для создания экземпляра класса внутри.больше, чем конструктор без параметров - используйте фабричный класс.Псевдокод:

// 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();
   }
};

таким образом, у вас есть фабричный класс с конструктором без параметров.Вы создаете экземпляр фабрики, а затем вызываете метод создателя для создания экземпляра вашего класса.

...