CoCreateInstance возвращая E_NOINTERFACE даже при том, что интерфейс найден

Браузер отображает маркеры, потому что свойство стиля "дисплей" первоначально установлено на "элемент списка". Изменение свойства дисплея для "встраивания" отменяет все специальные стили, которые получают элементы списка. Необходимо быть в состоянии моделировать его с: перед селектором и свойством содержания, но IE (по крайней мере, через версию 7) не поддерживает их. Моделирование его с фоновым изображением является, вероятно, лучшим перекрестным браузером способ сделать это.

8
задан sharptooth 23 November 2009 в 13:15
поделиться

3 ответа

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

Если вы определяете настраиваемый интерфейс, вам необходимо реализовать для него маршалинг, используя один из следующих подходов.

  • Стандартный маршалинг : используйте компилятор MIDL для создания прокси-сервера и заглушка, которую необходимо зарегистрировать в системе. Это, вероятно, лучший вариант, поскольку вы уже определили свой интерфейс.
  • Маршалинг OLE Automation : вы определяете совместимый с автоматизацией настраиваемый интерфейс и используйте маршаллер, который уже является частью структура COM
  • Пользовательский маршалинг : вы реализуете методы IMarshal

. Когда вы отлаживаете свой COM-сервер, хотя вы видите, что вы возвращаете свой пользовательский интерфейс при вызове QueryInterface, это не делает его через границу процесса, потому что COM не может понять, как маршалировать этот интерфейс, следовательно, клиент видит E_NOINTERFACE.

ОБНОВЛЕНИЕ (на основе вашего комментария)

Если это существующее приложение COM-сервера, то у вас, вероятно, уже есть прокси / заглушка. Вам необходимо зарегистрировать это как на клиенте, так и на сервере. Может быть, вы тестировали это на новой машине (ах) и просто забыли зарегистрировать это? Чтобы зарегистрироваться, просто выполните regsvr32 для прокси / заглушки dll.

6
ответ дан 5 December 2019 в 11:25
поделиться

Может быть проблема в модели потоковой передачи, о которой Раймонд Чен писал о ?

Отредактируйте в ответ на комментарий:

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

Это больше о потоковых моделях, чем насчет маршаллинга, правда.

2
ответ дан 5 December 2019 в 11:25
поделиться

Все это на самом деле довольно очевидно. Я только перечисляю Pythonic способы сделать эти вещи. Обновление: примеры теперь должны работать как в Python 2, так и в Python 3. Это происходит либо из-за того, что сервер не обрабатывается, либо из-за того, что сервер находится в процессе, а поток приложения-потребителя, который вызывает CoCreateInstance (), неправильно вызвал CoInitialize () / CoInitializeEx (), поэтому запрашивается "многопоточная квартира", как упоминалось в статье пользователь Томас упоминает в другом ответе.

Если вам нужен только внутрипроцессный сервер, вы можете подавить маршаллинг, убедившись, что поток, вызывающий CoCreateInstance (), либо вызывает CoInitialize (), либо CoInitializeEx () с COINIT_APARTMENTTHREADED для обеспечения «однопоточного апартамента».

Если вам нужен внепроцессный сервер, вы не сможете обойтись без маршалинга. В последнем случае вы можете сделать одно из следующего:

  • реализовать IMarshal - наименее предпочтительно
  • добавить прокси / заглушки и зарегистрировать их для своего пользовательского интерфейса
  • (не уверен, будет ли это работать для внешнего процесса, но это самый простой вариант), если ваш интерфейс можно упорядочить с помощью автоматизации marshaller просто включит typlib в ресурсы вашего COM-сервера и зарегистрирует эту typelib в реестре.
5
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: