Можно ли разделить общую реализацию компонента на два объекта? - PullRequest
1 голос
/ 25 октября 2008

Я видел в Microsoft COM и XPCOM, по крайней мере из того, что я прочитал и собрал до сих пор, что реализации интерфейсов в компоненте должны быть по существу в одном классе, который получает все виртуальные интерфейсы. Это правильно? Чего мне не хватает?

Есть ли способ иметь несколько объектов (возможно, в отдельных DLL), каждый из которых обеспечивает свою функциональность и при этом может свободно перемещаться между ними с помощью QueryIterface?

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

Ответы [ 2 ]

1 голос
/ 25 октября 2008

Это должно быть возможно, хотя, вероятно, не поддерживается стандартными высокоуровневыми оболочками. Большинство оболочек (ATL, MFC и т. Д.) Поддерживают отображение только COM-объекта в один класс. Однако QueryInterface разрешено возвращать другой указатель и вызывать код COM-объекта, поэтому первый COM-объект может загрузить другую DLL, создать экземпляр другого объекта и вернуть указатель на его интерфейс (vtable).

Насколько я знаю, все возможно, вы, скорее всего, сами будете писать много низкоуровневого клеевого кода.

0 голосов
/ 26 октября 2008

Да, ATL поддерживает отрывные интерфейсы Это позволяет реализовать интерфейс в другом классе, который создается только при запросе интерфейса. Поскольку он проходит только через интерфейс, я думаю, что он также может быть помещен в отдельную DLL.

(также может быть кэшировано после запроса один раз)

...