|
Создание экземпляра внутреннего COM-сервера
Для создания
экземпляра СОМ-сервера в Delphi необходимо
использовать функцию CreateComObject() модуля ComObj, определяемую
следующим образом:
function
CreateComObject(const ClassID: TGUID): IUnknown;
Параметр ClassID содержит CLSID, который определяет
тип создаваемого СОМ-объекта.
Значение, возвращаемое этой
функцией ?интерфейс
IUnknown этого СОМ-объекта.
Если СОМ-объект не может быть
создан, генерируется
исключительная ситуация.
Функция CreateComObject() инкапсулирует
API-функцию СОМ CoCreateInstance(). Внутри функции CoCreateInstance() для получения
интерфейса IClassFactory определенного
СОМ-объекта вызывается API-функция
CoGetClassObject(). Функция CoCreateInstance() выполняет этот вызов
при просмотре в системном реестре
параметров InProcServer32 СОМ-класса для того,
чтобы определить путь к DLL внутреннего сервера,
вызывая функцию LoadLibrary() для загрузки DLL внутреннего сервера, а
затем вызывая DLL-функцию DllGetClassObject(). После получения
указателя на интерфейс IClassFactory функция CoCreateInstance() вызывает функцию IClassFactory.Createlnstance() для создания
экземпляра определенного
СОМ-класса.
Совет |
Для
создания нескольких объектов
из фабрики классов
использовать функцию CreateComObject() неэффективно. Это
связано с тем, что после
создания необходимого
СОМ-объекта она удаляет
указатель интерфейса IClassFactory, полученный
функцией CoGetClassObject(). Если
необходимо создать несколько
экземпляров одинаковых
СОМ-объектов, вызовите функцию CoGetClassObject() непосредственно, а
затем используйте функцию IClassFactory.Createlnstance(). |
На заметку |
Перед
использованием любой СОМ- или
API-функции необходимо
инициализировать библиотеку
СОМ, используя функцию CoInitialize() с единственным
раметром nil. Для правильного
отключения библиотеки СОМ
необходимо вызвать функцию CoUninitialize() так, как ранее
вызывалась библиотека OLE.
Вызовы накапливаемы, т.е.
каждый вызов функции Colnitialize() в приложении должен
сопровождаться вызовом
функции CoUninitialize(). В приложениях
функция Colnitialize() вызывается
автоматически из метода Application.Initialize(), а функция CoUninitialize() вызовется
автоматически при завершении
модуля ComObj. Эти функции
необходимо вызывать из
внутренней библиотеки,
поскольку клиентные
приложения требуют выполнения
процесса инициализации и
деинициализации. |
|
|