<\body> Die Kommunikation zwischen und einer Anwendung kann außer über eine \RPipeline`` auch dadurch erfolgen, dass die Anwendung als \Rdynamically linked library'', DLL, eingebunden wird. \ Pipelines sind meist leichter zu implementieren, oft sehr robust und flexibel in Bezug auf Daten, die nur nach und nach erzeugt werden. Aber DLLs sind schneller. Um eine Anwendung dynamisch mit zu linken, sollten Sie dem Kommunikations-Protokoll folgen, das in folgenden Datei <\verbatim> \ \ \ definiert ist. Darin ist spezifiziert, dass die Anwendung folgende Datenstruktur exportieren soll: <\cpp-fragment> typedef struct package_exports_1 { \ \ char* version_protocol; /* "TeXmacs communication protocol 1" */ \ \ char* version_package; \ \ char* (*install) (TeXmacs_exports_1* TeXmacs, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ char* options, char** errors); \ \ char* (*evaluate) (char* what, char* session, char** errors); } package_exports_1; Sie enthält sowohl eine Installationsroutine für die Anwendung als auch eine Evaluierungsroutinen für zusätzliche Eingabe. (Mehr Informationen finden Sie in der Datei \ ). exportiert folgende Struktur: <\cpp-fragment> typedef struct TeXmacs_exports_1 { \ \ char* version_protocol; /* "TeXmacs communication protocol 1" */ \ \ char* version_TeXmacs; } TeXmacs_exports_1; Jedes Programm hat für sein Speicher-Management selbst zu sorgen. Zeichenketten, die \ erzeugt, müssen von gelöscht werden. Das gilt entsprechend für die Anwendung. Die Zeichenkette sollte und die Zeichenkette die Version Ihrer Anwendung enthalten. Die Funktion wird ein einziges Mal von mit den Optionen aufgerufen, um Ihre Anwendung zu initialisieren. Es überträgt die Routinen, die von exportiert werden, als . Diese Routine sollte, sofern erfolgreich, eine Statusmeldung zurückgeben, z.B.: <\verbatim> \ \ \ \ "Ihre CAS-Version wurde erfolgreich in TeXmacs eingebunden" Wenn die Installation ohne Erfolg blieb, sollten Sie zurückgeben und sollte eine erklärende Meldung enthalten.\ Die -Funktion dient zur Evaluierung von in einer -Sitzung mit dem Namen . Sie sollte das Ergebnis der Evaluierung von zurückgeben, falls erfolgreich, oder , wenn ein Fehler auftrat. kann, je nach Verlauf der Evaluierung, eine oder mehrere Warnungen enthalten oder eine Fehlermeldung, wenn die Evaluierung versagte. Die Formate sind die gleichen wie im Fall der Kommunikation über Pipelines. Schlieÿlich sollte die Konfigurations-Datei des Plugins noch so etwas wie das folgende enthalten: <\scheme-fragment> (plugin-configure \ \ (:require (url-exists? (url "$LD_LIBRARY_PATH" "lib.so"))) \ \ (:link "lib.so" "_exports" "") \ \ ) Hier ist _exports> ein Zeiger auf eine Struktur vom Typ \ . <\remark> Es ist möglich, dass das Kommunikations-Protokoll sich ändert. In diesem Fall werden die Daten-Strukturen und durch und ersetzt, worin n die Version des Protokolls ist. Diese Strukturen werden immer die abstrakten Strukturen und behalten, in denen die Informationen über die Protokoll-, - und Anwendungs-Version, enthalten sind. plugin> Das Beispiel Plugin zeigt, wie dynamisch ladbare Bibliotheken geschrieben und benutzt werden. Es besteht aus den Dateien: <\verbatim> \ \ \ \ \ \ \ \ \ \ \ \ Das enthält die Zeilen <\quotation> <\framed-fragment> <\with|par-par-sep|0fn> <\with|font-family|tt> tmsrc = /home/vdhoeven/texmacs/src/TeXmacs CXX = g++ LD \ = g++ \; lib/libtmdynlink.so: src/dynlink.cpp \ \ \ \ \ \ \ \ $(CXX) -I$(tmsrc)/include -c src/dynlink.cpp -o src/dynlink.o \ \ \ \ \ \ \ \ $(LD) -shared -o lib/libtmdynlink.so src/dynlink.o so dass zu einer dynamisch linkbaren Datei (DLL) kompiliert wird. Die Variable sollte so gesetzt sein, dass die include-Datei gefunden wird. Die Konfigurations-Datei enthält die folgenden Zeilen <\scheme-fragment> (plugin-configure dynlink \ \ (:require (url-exists? (url "$LD_LIBRARY_PATH" \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "libtmdynlink.so"))) \ \ (:link "libtmdynlink.so" "dynlink_exports" "") \ \ (:session "Dynlink")) Die Datei enthält die Zeichenkette <\cpp-fragment> static char* output= NULL; mit der letzten Ausgabe, die Initialisierungs-Routine <\cpp-fragment> char* dynlink_install (TeXmacs_exports_1* TM, char* opts, char** errs) { \ \ output= (char*) malloc (50); \ \ strcpy (output, "\\2verbatim:Started dynamic link\\5"); \ \ return output; } die Evaluierungs-Routine <\cpp-fragment> char* dynlink_eval (char* what, char* session, char** errors) { \ \ free (output); \ \ output= (char*) malloc (50 + strlen (what)); \ \ strcpy (output, "\\2verbatim:You typed "); \ \ strcat (output, what); \ \ strcat (output, "\\5"); \ \ return output; } und die Daten-Struktur den Exporten <\cpp-fragment> package_exports_1 dynlink_exports= { \ \ "TeXmacs communication protocol 1", \ \ "Dynlink 1", \ \ dynlink_install, \ \ dynlink_eval }; Beachten Sie bitte, dass bei der Ausgabe die Anwendung für die Reservierung und die Freigabe von Speicher zu sorgen hat. <\initial> <\collection>