Ошибка создания экземпляра COM-объекта - PullRequest
0 голосов
/ 25 июня 2009

В настоящее время я изо всех сил пытаюсь использовать COM DLL на простой системе, которую я сделал. Все успешно компилируется, но во время выполнения CoCreateInstace возвращает S_OK, но мой указатель на объект каким-то образом возвращает NULL.

Этот указатель интерфейса создан в моем заголовке класса. Самое странное, что создание экземпляра этого же типа указателя в стеке методов приводит к правильному объекту, но последующие вызовы __hook включают нарушение прав доступа при попытке создать класс BASE com.

Некоторые другие аспекты, которые могут быть полезны:

  • Попытка запустить программу с CoInitalizeEx, запущенным как COINIT_MULTITHREADED и COINIT_APARTMENTTHREADED

  • Проект является dll, который использует в нем COM dll

  • Я попробовал тот же метод без запуска нового потока, и ошибка сохраняется

  • Я создал тестовую программу (без потоков, исполняемый файл), и объект создается нормально и подключен правильно. Так что я предполагаю, что это что-то связанное с тем, что это сама DLL или связанная с резьбой.

PS: В качестве бонуса, почему Google не возвращает ничего благоприятного, связанного с COM? :)

Ответы [ 2 ]

2 голосов
/ 25 июня 2009

Звучит как ошибка в реализации COM-объекта IUnknown :: QueryInterface - не устанавливает выходной указатель, а возвращает S_OK.

CoCreateInstance для внутрипроцессного сервера в основном:

  • Загрузить DLL в память
  • Вызовите DllGetClassObject, чтобы получить фабрику классов
  • Вызовите IClassFactory :: CreateInstance из фабрики классов, которая выделяет новый объект
  • Вызовите IUnknown :: QueryInterface для нового объекта, чтобы получить желаемый интерфейс.

Возврат NULL, но S_OK на любом шаге должен привести к сбою, за исключением вызова QI в конце.

0 голосов
/ 25 июня 2009

Обнаружена проблема: атрибут модуля был определен в статической библиотеке, и это привело к тому, что COM-объект сошел с ума; Перемещение на источник DLL решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...