Необходимо дублировать IDispatch * с поддержкой .NET;не знаю имя класса - PullRequest
1 голос
/ 12 марта 2011

Я размещаю библиотеку .NET в моей программе на C ++, используя следующие методы, но это не полный список:

CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
Invoke()

У меня есть классы C ++, которые соответствуют классам .NET. Каждый экземпляр класса содержит CComPtr<IDispatch>, который я использую для вызова функций и получения / установки переменных-членов.

Это работает нормально, за исключением того, что когда я копирую свой класс C ++, я получаю два экземпляра класса C ++, которые оба указывают на один и тот же экземпляр .NET. Когда я изменяю значение переменной в одном экземпляре, оно отражается в другом.

Итак, мне бы очень хотелось продублировать мой указатель IDispatch, чтобы у каждого экземпляра класса C ++ был один уникальный экземпляр класса .NET. Я мог бы позвонить CreateInstance(), но по разным причинам выяснять имена библиотек и классов неудобно.

ТЛ; др
Как можно дублировать мой указатель IDispatch с поддержкой .NET без поиска имен классов / библиотек?

Спасибо!

1 Ответ

3 голосов
/ 12 марта 2011

Это ожидаемое поведение, конструктор копирования CComPtr просто скопирует указатель интерфейса и добавит ссылку с помощью AddRef (). Механизма автоматического создания глубокой копии не существует ни в COM, ни в .NET. Это принципиально не отличается от C ++. Существует хорошо известный интерфейс, определенный в .NET, ICloneable. Он едва избежал признания устаревшим, интерфейс не может позволить вызывающей стороне указать, что желательна глубокая копия вместо мелкой. Делать это рядом бесполезно и очень редко реализовано. Здесь все равно не поможет, COM не имеет ничего подобного.

Нет, вам нужно будет поддерживать достаточно состояния и писать код для создания нового объекта. Сделайте обзор вашей потребности в этом. Если вы делаете копию объекта C ++ исключительно с намерением создать копию COM-объекта (и его базового объекта .NET), то вам, вероятно, не следует делать эту копию.

...