Разница между vlax-invoke и vlax-invoke-method
В кодах, публикуемых на форумах, можно встретить пять вариантов записи очень похожих конструкций:
1 2 3 4 5 | vlax-invoke {Object} '{Method} vlax-invoke {Object} "{Method}" vlax-invoke-method {Object} '{Method} vlax-invoke-method {Object} "{Method}" vla-{Method} {Object} |
В чем между ними разница, и есть ли она вообще?
Разницы между записью vlax-invoke {Object} '{Method} и vlax-invoke {Object} "{Method}", или между vlax-invoke-method {Object} '{Method} и vlax-invoke-method {Object} "{Method}" никакой. А вот в остальном - есть. Во-первых, последний вариант доступен только для штатных примитивов AutoCAD. Попытка обработать таким образом примитив любого вертикального приложения практически обречена на провал (ну, если, конечно, определенных танцев с бубнами не выполнять).
Во-вторых, есть разница между результатами, возвращаемыми vlax-invoke и vlax-invoke-method. Допустим, у нас есть вставленный блок (блок с атрибутами) и получен на него указатель:
1 2 3 4 5 6 | _$ (setq ent (vlax-ename->vla-object (ssname (ssget "_+.:S:E" '((0 . "INSERT"))) 0))) #<VLA-OBJECT IAcadBlockReference2 0000000026b9e3e8> _$ (vlax-invoke ent 'getattributes) (#<VLA-OBJECT IAcadAttributeReference 00000000268cf288>) _$ (vlax-invoke-method ent 'getattributes) #<variant 8201 ...> |
Казалось бы, все очевидно: vlax-invoke возвращает нормальный список, vlax-invoke-method существует уже как чистый ActiveX, возвращая variant.
И что, теперь плевать на vlax-invoke-method? К сожалению, так получается не всегда. В некоторых случаях vlax-invoke может не сработать.
Нарисуем "от балды" полилинию и получим на нее vla-указатель:
1 2 | _$ (setq pline (vlax-ename->vla-object (car (entsel)))) #<VLA-OBJECT IAcadLWPolyline2 0000000026b00ef8> |
И применяем к ней GetBoundingBox:
1 2 3 4 5 6 | _$ (vlax-invoke pline 'GetBoundingBox 'minp 'maxp) nil _$ minp nil _$ maxp nil |
Как видно, в minp и maxp ничего не хранится. В то же время:
1 2 3 4 5 6 | _$ (vlax-invoke-method pline 'GetBoundingBox 'minp 'maxp) nil _$ minp #<safearray...> _$ maxp #<safearray...> |
Разница? Разница!
Кроме того, официально конструкция vlax-invoke не поддерживается и может прекратить свое существование в любой момент, в отличии от vlax-invoke-method.
И, наконец, последнее. Для пользовательских СОМ-серверов вопрос "что применять - vlax-invoke или vlax-invoke-method" лично у меня однозначного ответа не имел. Сейчас мне кажется, что vlax-invoke можно использовать только в том случае, если vlax-invoke-method не срабатывает (говорят, такое тоже бывает).