love5an: (Default)
Продолжаем серию постингов "C++ - говно". На этот раз у нас в гостях C#, а тема - написание COM-компонентов.

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

На самом деле это не так. COM в своей основе крайне прост, и является одной из самых удобных технологий для интероперабельности между различными платформами, рантаймами языков программирования и программами. Для случая RPC же, COM вообще является чуть ли не самой простой и удобной из всех таких технологий, и одной из наименее затратных по памяти и производительности(особенно в сравнении со всякими XML-RPC).
Read more... )

GC и COM

Mar. 10th, 2011 07:36 pm
love5an: (Default)
Все-таки я решил все проблемы с GC и апартаментами COM в Doors.

Да, все именно так, как вы думаете - теперь время жизни COM-интерфейсов и COM-wrapper'ов полностью управляется сборщиком мусора, причем управляется, вне зависимости от типов апартаментов, правильно и без глюков.

Естественно, бывают ситуации, когда COM-объекты должны иметь строго определенное время жизни, и поэтому я оставил возможность вызова Release. Но, doors.com:release ведет себя не совсем как обычный IUnknown->Release(), и почему - будет понятно ниже.

Вкратце - doors.com:release примерно аналогичен IDisposable.Dispose из .NET - в том плане, что COM объекты освобождаются либо им, либо сборщиком мусора.
Ну и, сразу стоит упомянуть про два "with-" макроса, связанных с этим методом:


(defmacro with-interface ((var interface) &body body)
`(let ((,var ,interface))
(unwind-protect
(locally ,@body)
(release ,var))))

(defmacro with-interfaces ((&rest specs) &body body)
(if (null specs)
`(locally ,@body)
`(with-interface ,(car specs)
(with-interfaces ,(rest specs)
,@body))))

Что они делают - думаю, понятно.

А теперь подробнее.
Read more... )
love5an: (Default)
Я тут закоммитил в Doors большой патч - имеет смысл посмотреть, кому интересно.
user32 пока не допилил, но придумал что делать с "apartments" из COM.
Вернее, как это дело привязать к сборщику мусора.

Ситуация такая:
COM Lisp environment

То есть, все состояние лисп-системы, поддерживающей мультитрединг - в MTA.
Какие-то треды могут инициализироваться в STA, но вне их - MTA.

Еще, как видно, есть такая штука как post-mortem тред. Что это такое?
Дальше подробно и с картинками )
love5an: (Default)
Вчера тут игрался с COM, опять.

Удалось запустить local(out-of-process) COM-сервер на лиспе - см. картинку ниже(кликабельно).
SBCL на заднем плане это сервер, а на переднем, соответственно - клиент, который к нему коннектится.
Local COM server example

Вот полный код examples/com.lisppaste.lisp.org/display/120048
Я это дело пока не закоммитил, добавлю на github когда вот на днях допилю user32.

Понятное дело, что out-of-process COM-сервер обязательно регистрируется в реестре, вот .reg файл:
github.com/downloads/Lovesan/doors/helloworld.reg

Ну и понятно, естественно, что аргументы между процессами надо как-то маршалить. Я тут это делаю очень просто, через OLE automation, т.е. через TypeLib, как видно из .reg-файла, без всяких там proxy/stub приблуд и кастомных IMarshal.
Но пока что я в Doors до OLE и OLE automation не добрался, поэтому все это надо делать ручками, через midl-файлы.
Хотя я и планирую потом сделать lisp-friendly интерфейс к typelib.

Вот .midl файл, в котором описывается интерфейс, класс и сама typelib:
github.com/downloads/Lovesan/doors/helloworld.midl
И вот, соответственно, .tlb файл, на случай если у кого из желающих попробовать пример не будет под рукой midl-компилятора:
github.com/downloads/Lovesan/doors/helloworld.tlb (в .reg путь к ней надо, естественно, заменить на свой)

user32

Feb. 26th, 2011 09:44 pm
love5an: (Default)
Почти допилил биндинг к Windows USER, скоро будет крупный коммит в Doors.

Window

Вот это окно рисуется таким кодом:

(define-callback (my-wndproc :stdcall)
lresult ((hwnd handle) (msg uint) (wparam wparam) (lparam lparam))
(if (= msg wm-destroy)
(progn (post-quit-message) 0)
(def-window-proc hwnd msg wparam lparam)))

(defun main ()
(register-class (make-wndclass
:wndproc (get-callback 'my-wndproc)
:style '(:vredraw :hredraw)
:instance module-handle
:background color-background
:class-name "Window"))
(unwind-protect
(progn
(show-window (create-window
:class-name "Window"
:window-name "Window"
:style :overlapped-window))
(loop :for msg = (get-message) :until (null msg)
:do (translate-message msg)
(dispatch-message msg)))
(unregister-class "Window")))


Для сравнения - код, делающий аналогичное(!) на Си:
htp://pastebin.com/GBJh691R
love5an: (Default)
Полтора месяца я боролся с кривым Clozure CL, который поддерживает метаобъектный протокол CLOS через задницу, и то кое-как.

Read more... )
Метаклассы это вообще круто, они дичайше абстрагируют и очень сильно помогают писать меньше кода.

Да и, про пост о CLOS и cells я не забыл.

Кстати, библиотека cells не умерла, она переехала на github, и там про нее автор написал большую статью-документацию:
https://github.com/kennytilton/cells/wiki (кстати, еще cells есть в quicklisp, начиная, вроде бы, с декабря)
love5an: (Default)
Попробовал тут, ради интереса, COM-interop из Doors в контексте дотнета.
Read more... )
love5an: (Default)
Только что добавил в Doors аналог "Runtime Callable Wrapper" из .NET

Read more... )
love5an: (Default)
На прошлой неделе я работал в основном над улучшением той части Doors, которая отвечает за общение с COM.

         Doors, как я уже рассказывал, обеспечивает двустороннее взаимодействие с COM. Это значит, что Doors позволяет не только вызывать какие-то внешние интерфейсы каких-либо внешних компонентов, но и также и определять свои COM-классы, и передавать интерфейсы их объектов в сторонний код.

         Здесь, конечно, следует упомянуть про то, как крут Common Lisp, потому что, например, чтобы обеспечить вменяемое взаимодействие с COM в С++, майкрософту потребовалось расширять компилятор VC++, и ровно то же сделано в большинстве других языков, которые эту самую вменяемую интероперабельность с COM обеспечивают - то есть расширения компиляторов или рантаймов. В CL мне достаточно было определить несколько умных макросов и парочку классов.

Теперь немного поподробнее.

Read more... )
love5an: (Default)
Завел блог на английском, в котором буду описывать процесс разработки Virgil, Doors и LDX

http://love5an.wordpress.com/
love5an: (Default)
Добавил странички про Doors и Virgil на cliki.
love5an: (Default)
В Doors добавлены новые функции/структуры/перечисления и константы Windows API:

Read more... )
love5an: (Default)
В Doors добавлены полные биндинги к консольной подсистеме Windows:
http://github.com/Lovesan/doors/blob/master/system/console.lisp

Если кратко, то там все, что описано вот здесь:
http://msdn.microsoft.com/en-us/library/ms682010%28v=VS.85%29.aspx
Read more... )

Doors

Oct. 21st, 2010 04:35 pm
love5an: (Default)
http://github.com/Lovesan/doors
Автор я.

Read more... )

Profile

love5an: (Default)
Dmitry Ignatiev

December 2016

S M T W T F S
    123
45678910
11121314 151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 12:50 pm
Powered by Dreamwidth Studios