Глава 5

Информация о версии

В данной главе представлены различные сведения характерные для текущей версии LuaCOM. Здесь записаны текущие ограничения LuaCOM, известные его ошибки, история изменений прежних версий, технические подробности и т.д.

5.1 Ограничения

Здесь перечислены текущие ограничения LuaCOM, по состоянию на данную версию, и сведения о будущем ослаблении этих ограничений.

5.2 Известные ошибки

Здесь перечислены известные ошибки в LuaCOM. Если найдете любые другие ошибки, сообщите о них через домашнюю страницу LuaCOM.

5.3 Дальнейшие улучшения

Помимо усовершенствований перечисленных в главах ?? и ??, есть и другие запланированные улучшения:

5.4 Значимые проблемы LuaCOM

LuaCOM в использовании очень похож на другие языки с поддержкой Automation или среды разработки (Visual Basic®, VBA, VBScript™, pycom и т.д.). Тем не менее, есть некоторые тонкие различия, которые могут запутать программиста: другой синтаксис, неожиданное поведение и т.д. Чтобы облегчить задачу пользователю LuaCOM, здесь мы объединили сведения об этих проблемах.
5.4.1 Проблемы создания экземпляра (инстанцирования) объектов COM
Некоторые COM-объекты могут располагаться во внутрипроцессных серверах (реализованных в DLL'ках) и в локальных серверах (реализованных как отдельные процессы). COM отдает предпочтение внутрипроцессным серверам, так как они более быстрые. Тем не менее, некоторые приложения могут не работать с LuaCOM, работающим в качестве внутрипроцессных серверов. Следует создавать экземпляр COM-объекта предоставляя дополнительный флаг, заставляющий использовать локальные серверы. Смотрите документацию по функции API CreateObject.
5.4.2 Реализация COM-объектов из памяти
В обычной ситуации внепроцессный COM-сервер должен завершить существование когда высвободятся все ссылки на его объекты. Это может иметь важное значение, так как создание новых экземпляров может зависеть от отсутствия работающего сервера. LuaCOM объединяет стандартный механизм подсчета ссылок COM со сборщиком мусора Lua. Это прекрасно работает в большинстве ситуаций, но имеются несколько случаев, в которых требуется более тщательный анализ: Для более подробной информации, смотрите главу 4.
5.4.3 Получение событий
Для получения событий и уведомлений от COM-объекта необходимо установить соединение с помощью точек подключения. Но этого не достаточно: для получения этих уведомлений клиентское приложение должно иметь работающий цикл обработки сообщений. Для более подробной информации, смотрите главу 3.3.3.
5.4.4 Расширяемые интерфейсы
Некоторые объекты, имеющие типовые сведения описывающие их интерфейсы (методы, свойства, типы параметров и т.д.), могут дополняться новыми методами и свойствами во время выполнения. Это означает, что эти методы и свойства могут быть доступны только с тем же самым механизмом LuaCOM, используемым для универсального COM-объекта. Из этого есть несколько выводов: Такое поведение имеют COM-объекты связанные с WMI. Для более подробной информации, смотрите главу ??.
5.4.5 Проблема Visual Basic®
COM-сервер реализованный с помощью LuaCOM можно без проблем использовать в Visual Basic.
Public lc as Object
Set lc = CreateObject("MyCOMObject.InLuaCOM")
lc.showWindow
b = lc.getData(3)
lc.Quit
Но если нужно принимать события, сгенерированные COM-объектом, реализованным с помощью LuaCOM, то необходимо использовать Public WithEvents от Visual Basic:
Public WithEvents obj as MyCOMObject.Application
Set obj = CreateObject("MyCOMObject.Application")
Private Sub obj_genericEvent()
  ’ Put your event code here (поместите здесь код события)
End Sub
Здесь имеется проблема: когда VB (т.е. Visual Basic) присваивает результат CreateObject переменной obj, он пытается получить интерфейс раннего связывания (насколько я знаю, VB использует интерфейсы позднего связывания только с переменными типа Object). LuaCOM не работает с интерфейсами раннего связывания (известного как vtable). Если вызвать любой метод, использующий переменную obj, VB выдаст исключение.

Принятое решение состояло в том, чтобы допустить QueryInterface для интерфейса раннего связывания таким образом, разрешается использование Public WithEvents). Теперь клиент должен делать “преобразование типа” для правильного использования COM-объекта:
Public WithEvents obj_dummy as MyCOMObject.Application
Public obj as Object
Set obj_dummy = CreateObject("MyCOMObject.Application")
Set obj = obj_dummy
Таким образом клиент может вызывать методы COM-объекта с помощью переменной obj.

5.5 История версий

Версия 1.4 Версия 1.3 Версия 1.2 Версия 1.1 Версия 1.0 Версия 0.9.2 Версия 0.9.1


LuaCOM был разработан Renato Cerqueira, Vinicius Almendra и Fabio Mascarenhas.
Проект финансируется компанией TeCGraf
(Technology Group on Computer Graphics).