Типы ЭЛТ через границы процесса

Я делаю перетаскивание из элемента управления ActiveX. При перетаскивании я предоставляю CComQIPtr, в котором реализованы COM-методы для передачи информации в целевой объект. При отбрасывании процесс отбрасывания цели вызывает мои COM-методы для получения информации.

Разрешено ли мне использовать типы CRT или указатели на типы CRT вблизи границы этого интерфейса? Я хотел бы, чтобы у моего IDataObject был личный std::list и некоторые std::strings, а на внешней стороне интерфейса была возможность вызывать мои COM-методы, которые могут обращаться к этим закрытым членам.

Я думаю, что все в порядке, потому что я на самом деле не передаю типы CRT через границу.

MSDN: потенциальные ошибки при прохождении объектов CRT через границы DLL

1 ответ

Решение

Вы можете использовать все, что вам нравится в реализации вашего com-объекта, так как он всегда остается в процессе (или dll), который его создает.

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

Ты прав. Эта статья не относится к этой ситуации, так как вы ничего не пропускаете через границу. Инфраструктура COM имеет дело с маршалингом типов COM через границу для вас.

Просто убедитесь, что вы перехватываете все исключения внутри ваших методов COM, вы не можете позволить им вытекать из функции, поскольку инфраструктура COM не знает, что с ними делать.

Лично я склонен иметь тонкий слой кода COM, который имеет дело с преобразованием между типами COM и "нормальными" типами, а затем вызывает код, который выполняет реальную работу (см. Здесь). Этот уровень включает в себя обработчик исключений, который перехватывает все и преобразует в соответствующие HRESULT.

Другие вопросы по тегам