Dziś chciałbym poruszyć zagadnienie integracji node.js z kodem natywnym na platformie Windows.
Na stronie http://nodejs.org/api/addons.html znajdziemy opis tworzenia własnych rozszerzeń dla node.js w oparciu o kod C/C++. Nie jest to z pewnością łatwy proces. Wśród różnych czynności powstaje kompilowany plik *.node z bindingami. Taki właśnie zaobserwowałem w pakiecie drivera do Microsoft SQL Server.
Częściej jednak po prostu chcemy wywołać istniejącą już niezarządzaną bibliotekę .dll lub obiekt COM. Poniżej spisałem, co udało mi się ustalić.
Dynamiczne biblioteki C/C++ (.dll)
- https://github.com/rbranson/node-ffi (wywoływanie z poziomu JavaScript bez pisania linijki C/C++)
- https://github.com/tjanczuk/edge (za pośrednictwem .NET)
COM
- https://github.com/idobatter/node-win32ole (dostęp z poziomu JavaScript do Excel, Word, Access, Outlook, WMI, WSH itp, interesujące przykłady)
- https://github.com/tjanczuk/edge (za pośrednictwem .NET)
A teraz pora na krótką relację z tego co udało się odpalić “na żywo”.
Pobieranie infomacji o systemie
Załóżmy, że ktoś nagle zapragnął, by aplikacja node.js wyświetlała informacje na jakiej wersji Windows jest hostowana. Kierując się czasem i wygodą możemy użyć .NET i znanego od dawna kawałka C#. W tym konkretnym przykładzie wygląda on następująco:
Najprostszy typowy kod integrujący:
Wywołanie JavaScript:
W przeglądarce mam ładnego JSON-a:
Wyświetlanie maili z Outlooka
Załóżmy większy odlot w postaci udostępnienia dla node.js maili ze skrzynki Inbox z aplikacji Microsoft Outlook. Co prawda to z pewnością rzadki scenariusz, ale chodziło mi o wywołanie COM-a. Pobieranie maili realizuję znanym od dość dawna kawałkiem kodu w C# (nawet nie używam dynamic):
Kod integrujący i wywołanie z poziomu JavaScript są zrobione tak jak w pierwszym przykładzie. W przeglądarce dostaję maile:
BTW Powyższy kod samej integracji z Outlook nie jest do końca niezawodny (kwestia otworzonych instancji), ale tak samo zachowuje się poza node.js. Chodziło mi tutaj tylko o najprostsze demo.
Inaczej?
Integrację zrealizowałem dla wygody przez .NET. Jeśli chcemy wołać natywny kod bezpośrednio z JavaScript, możemy użyć pakietów node-ffi i win32ole. Umożliwiają one odpowiednio - wywoływanie natywnych bibliotek DLL oraz obiektów OLE (jest nawet podobny przykład z mailami Outlook’a). IMHO można spróbować z nich skorzystać, gdy będziemy chcieli wywołać kompletną funkcjonalność z kodu natywnego (tzn. nie będziemy chcieli skorzystać z niej w połączeniu z kodem .NET). Pakiety te wydają mi się też bardziej eksperymentalną opcją –;)
Brak komentarzy:
Prześlij komentarz