Думайте о COM как о двоичном совместимом способе обмена интерфейсами через границы DLL. Классы C ++ не могут быть легко экспортированы из DLL из-за нестандартного искажения имени между различными версиями компилятора. COM позволяет коду в одной DLL или исполняемом файле создавать реализацию интерфейса из другой DLL или EXE, если эта реализация следует определенному интерфейсу и соглашению о вызовах. Это то, что позволяет классу COM быть написанным на C # и вызываться из C ++, Python и многих других языков, поддерживающих COM.
COM-интерфейсы - это просто стандартные классы C ++, содержащие все чисто виртуальные функции и производные от IUnknown. IUnknown - это предопределенный интерфейс, из которого должны быть получены все совместимые COM-интерфейсы, который предоставляет общие средства, такие как подсчет ссылок и возможность запрашивать, реализует ли объект конкретный интерфейс.
Библиотеки DLL, которые хотят сообщить о том, что могут создавать реализации интерфейсов COM, делают это путем экспорта 4 функций:
- DllGetClassObject => Возвращает фабрику классов запрошенного интерфейса
- DllCanUnloadNow => Все ли розданные экземпляры были освобождены
- DllRegisterServer => Зарегистрировать типы, которые эта DLL поставляет в реестре
- DllUnregisterServer => Отменить регистрацию этой DLL и ее типов в реестре
Итак, чтобы ответить на ваши вопросы:
Q1. О Windows DLL Насколько я понимаю, Windows DLL может экспортировать функции,
типы (классы) и глобальные переменные. С этим пониманием все в порядке?
DLL могут экспортировать функции и классы (не уверен насчет глобальных переменных, но вы не хотите экспортировать их DLL, даже если можете!) DLL или EXE-файлы с одинаковыми именами (плохой способ ведения бизнеса). Функции с соглашением о вызовах в стиле C не искажены, поэтому их можно без проблем экспортировать и вызывать из других мест.
Q2. COM DLL экспортирует обе функции, такие как DllRegisterServer () и DllGetClassObject (),
а также классы, которые реализуют интерфейс IUnknown. Это понимание всех
право?
На полпути, есть 4 функции для экспорта в полноценную COM-совместимую DLL (показано выше). Вы можете найти в MSDN любое из этих имен, чтобы увидеть их полные подписи. Ваша реализация для DllGetClassObject будет основной, которую будут использовать внешние стороны. Они могут использовать это, чтобы получить IClassFactory к интерфейсу, который предоставляет ваша DLL, а затем использовать его для создания экземпляра.
COM - большой и сложный зверь, но его основы довольно просты. Вы также можете проверить эту ссылку COM Intro для получения дополнительной информации. Удачи!