2009-06-24 3 views
0

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

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

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

  • Пытался запустить программу с CoInitalizeEx начался как COINIT_MULTITHREADED и COINIT_APARTMENTTHREADED

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

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

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

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

ответ

2

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

CoCreateInstance для в-прок сервер в основном:

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

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

+0

Я так не думаю, потому что таким образом приложение образца, которое я тоже сделал, тоже не работает. – 2009-06-25 11:45:43

0

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

Смежные вопросы