Наткнулся на вопрос в .NET 2003 о создании дополнительных интерфейсов. Наверное, я тупой...
Упростим задачу. Пусть есть COM ATLSomeObject объект, который имеет единственный интефейс IATLSomeObject, имеющий единственный метод Message( void ). Надо добавить второй интерфейс IATLSomeObject2, имеющий одноимённый метод Message(void).
Читаем MSDN. Там две возможности. Выбираем вторую, визардовую ...и ... упс визард не хочет ничего добавлять несмотря на то, что макро BEGIN_COM_MAP я уже добавил ( MS говорит, что без этого не будет работать... а оно хоть с этим, хоть без этого не печатает...). Это вопрос # 1. Почему визард не помогает приладить новый (дополнительный) интерфейс.
Тогда, перехожу к первому способу. Руками добавляю в idl второй интерфейс IATLSomeObject2 с методом Message. Пробую в меню "Implement interface". Работает. Что интересно, совершенно безразлично определил я ранее BEGIN_COM_MAP, или не определил. Это вопрос # 2. Непонятность это потому, что как сказано в MSDN, без BEGIN_COM_MAP вроде как вообще и не добавить дополнительный интерфейс. А добавляется ведь...
Ладно, думаю, хоть сервер и собирается без ошибок и предупреждений, но клиент уж точно не будет работать, поскольку, я заветный макро BEGIN_COM_MAP закоментировал, а без него, вроде как и не будет QueryInterface. Наивный... Оно работает.
Это вопрос # 3. и самая большая непонятность. Как компилятор .NET 2003, работая с ATL проектом, умеет сообразить только на основании наследования интерфейса (чисто C++ наследование, см. ниже;c таким же успехом можно было бы отнаследоваться от чего угодно, не связанного с COM), что надо построить соответствующую правильную DllGetClassObject, если мы не определяли в классе COM_INTERFACE_ENTRY.
Для простоты, привожу очень простой код сервера и клиента. Без всяких проверок. Клиент намерено сделан без smart poiners, чтобы за спиной ничего не стояло. Сервер в одном .h файлев основном.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Server
//
Разобрался.
Попробовал проект без атрибутов класса - ясно стало ;)) . Единственное несответствие, которое нашёл, что пока ручками в idl не пропишешь новый интерфейс - всё равно не работает визард "implement interface", а должен бы, как написано в MSDN.
Ещё вопрос. Attributed класс - очень уж удобное дело. Какое преимущество в использовании проекта с классами без атрибутов?
Спасибо всем.
Не разобрался...13.10.05 07:40 Автор: void <Grebnev Valery> Статус: Elderman
Наверное, я всёже не то, что-то делаю, или не понимаю, или это действительно баг у MS
Оба типа COM ( 1) проект ATL attributed; 2) проект ATL с объектами без атрибутов ) прекрасно работают с C++ клиентами, т.е. в обоих случаях оба интерфейса прекрасно разрешаются, так что вызываются методы в коде типа:
Но вот в клиенте C# как оказывается запросить оба интерфейса можно только для COM, который сделан с ATL attributed классами.
Т.е. можно повторить С++ вызовы в C# для обоих интерфейсов в коде типа
Если же объекты сделаны без атрибутов, то ничего подобного не удаётся сделать в клиенте C# (в отличии от C++). В этом случае второго интерфейса не видно напрочь. Такое ощущение, что всё же в этом моём проекте без аттрибутов где-то косяки... Хоть и работает с C++ клиентами на ура.
Если кто сталкивался подскажите, плз.
Сам себя к столбу позора14.10.05 05:37 Автор: void <Grebnev Valery> Статус: Elderman
Не удаляю ветку, чтоб другим не повадно было так же ....
Так сказать сам себя к столбу позора.
Парни, мне очень стыдно... Я просто в idl описании класса забыл второй интерфейс вставить.