LINUX.ORG.RU
Ответ на: комментарий от AF

>HINT
индекс функции в vtbl как там берется? можно ссылку? пока сам поищу

gavv
() автор топика
Ответ на: комментарий от anonymous

>Бинарное представление C++ объектов в реализации компилятора от Microsoft документировано
можно ссылку на оф. документацию? я пока не нашел

gavv
() автор топика
Ответ на: комментарий от anonymous

спасибо, нашел
насколько я понял, сейчас уже ее никто не обязан придерживаться - документ 93 года и в msdn не видно
но почитать интересно

gavv
() автор топика
Ответ на: комментарий от gavv

Можете и не придерживаться, но тогда не получится использовать абстрактные классы С++ для COM-интерфейсов.

anonymous
()
Ответ на: комментарий от anonymous

>Можете и не придерживаться, но тогда не получится использовать абстрактные классы С++ для COM-интерфейсов.
я о том, что не нашел документации, где в современных версиях msvc обещается ее использование. но да, верю, что пока менять они ничего не будут.

никогда не использовал COM, правильно я понял, что единственное отличие COM-класса - это аттрибуты novtable и stdcall? просто интересно

gavv
() автор топика
Ответ на: комментарий от anonymous

>Бинарное представление C++ объектов в реализации компилятора от Microsoft документировано.

Ну и с СОМ они совместимы?

AF ★★★
()
Ответ на: комментарий от gavv

>directx особо и не причем, просто COM :)

Верно! Я его хидеры в качестве примра кода привел!

AF ★★★
()
Ответ на: комментарий от AF

> В частном случае конкретная реализация С++ при определенных ограничениях может генерировать бинарную структуру абстрактного класса совместимую с COM.

anonymous
()
Ответ на: комментарий от anonymous

на деле, я так понял, почти всегда, потому что не нашел отдельных параметров «сделать класс COM»

gavv
() автор топика
Ответ на: комментарий от anonymous

>> В частном случае конкретная реализация С++ при определенных ограничениях может генерировать бинарную структуру абстрактного класса совместимую с COM.

Следовательно проблема топика решена!

AF ★★★
()
Ответ на: комментарий от AF

ну, это гарантирует, что хак с vtbl будет работать еще долго :)

gavv
() автор топика
Ответ на: комментарий от AF

правда с указателями на методы все хуже, их представление зависит от прагм, опций версии и архетектуры

gavv
() автор топика
Ответ на: комментарий от gavv

>правда с указателями на методы все хуже, их представление зависит от прагм, опций версии и архетектуры

Да, есть такая фигня. Выхода я вижу два:

1)Ограничить кросплатформенность. Это опрадванно для узко специализированного софта

2)Инкапсулировать указатель на метод. Т е писать таким образом, чтобы указатель на метод гарантированно не пересекал границы бинарного модуля.

AF ★★★
()
Ответ на: комментарий от gavv

Ограничения есть. Например, если не ошибаюсь, то виртуальное наследование приводит к несовместимому с COM бинарному формату.

anonymous
()
Ответ на: комментарий от gavv

аттрибуты novtable и stdcall?

stdcall обязателен для COM-интерфейсов, а novtable к COM не относится (рассматривайте его как оптимизацию кода)

anonymous
()
Ответ на: комментарий от gavv

>никогда не использовал COM, правильно я понял, что единственное отличие COM-класса - это аттрибуты novtable и stdcall?

С точки зрения бинарной структуры для COM-интефейся подойдет класс с виртуальными функциями. А вообще для COM помимо бинарной структуры интефейса существует еще много каких соглашений.

stdcall на бинарную структуру интерфейса не влияет: он нужен чтобы можно было дергать из разных языков.

anonymous
()
Ответ на: комментарий от anonymous

>Ограничения есть. Например, если не ошибаюсь, то виртуальное наследование приводит к несовместимому с COM бинарному формату.

Не думаю, что это особо помешает. Обьект сам решает, указатель на какой класс надо отдать в качестве интерфейса. Так что на этом этапе можно сделать все нужные преобразования.

AF ★★★
()
Ответ на: комментарий от AF

думаю, нельзя будет вызвать из C, потому что негде взять смещение для this (в си-версии vtbl его вроде не предусмотренно)

gavv
() автор топика
Ответ на: комментарий от gavv

This ты получишь с помощью вызова метода QueryInterface. Все дальнейшие действия будут зависеть от того, какого типа этот this.

Так вот если этот тип является абстрактным классом, и этот класс не имеет под собой иерархи с множественным наследованием, то ничто тебе не помешает использовать его из С.

AF ★★★
()
Ответ на: комментарий от AF

если мы получили интерфейс IA, которому соотвествует класс A, который реализует какой-то метод в виртуальном базовом классе, который может к COM не имеет отношения, то откуда пользователь IA узнает, что для вызова метода из vtbl нужно еще и смещение к this прибавить?

gavv
() автор топика
Ответ на: комментарий от gavv

Ниоткуда не узнает)

Костыль оновывается на том, что обязательный для каждого СОМ обьекта метод QueryInterface может подготовить корректный указатель. При этом он не обязан преобразовывать свой this. Он может вернуть указатель вообще на другой экземпляр. Абы только интерфейс был нужный и все работало.

AF ★★★
()
Ответ на: комментарий от AF

> Не думаю, что это особо помешает

Тебе же говорят, что при виртуальном наследовании генерируется бинарная структура иная нежели при простом наследовании и она не соответствует спецификации COM.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.