sobota, 13 kwietnia 2013

Node.js + kod natywny

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)

COM

A teraz pora na krótką relację z tego co udało się odpalić “na żywo”.

sn6

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:

image

Najprostszy typowy kod integrujący:

image

Wywołanie JavaScript:

image

W przeglądarce mam ładnego JSON-a:

image

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):

image

Kod integrujący i wywołanie z poziomu JavaScript są zrobione tak jak w pierwszym przykładzie. W przeglądarce dostaję maile:

sn8

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: