Подумайте о COM как двоичном совместимом способе совместного использования интерфейсов через границы DLL. С ++ классы не могут быть легко экспортированы из 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 для получения дополнительной информации. Удачи!
+1 COM не такой сумасшедший. Это позволяет вам связывать языки высокого уровня с низким уровнем разрыва. – pestilence669