Out-of-Process COM-сервер
Feb. 28th, 2011 04:11 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вчера тут игрался с COM, опять.
Удалось запустить local(out-of-process) COM-сервер на лиспе - см. картинку ниже(кликабельно).
SBCL на заднем плане это сервер, а на переднем, соответственно - клиент, который к нему коннектится.

Вот полный код examples/com.lisp : paste.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 путь к ней надо, естественно, заменить на свой)
Удалось запустить local(out-of-process) COM-сервер на лиспе - см. картинку ниже(кликабельно).
SBCL на заднем плане это сервер, а на переднем, соответственно - клиент, который к нему коннектится.

Вот полный код examples/com.lisp : paste.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 путь к ней надо, естественно, заменить на свой)