Hallo zusammen,
ich wollte mich mal an der Plugin-Schnittstelle versuchen, nehme aber nicht wahr, dass mein erstelltes Plugin ausgeführt wird.
Lt. Lexikon sollte es auch möglich sein, die Plugins mit anderen Programmiersprachen als Object Pascal zu entwickeln. Ich versuche es zur Zeit mit der Sprache C.
Hierfür sind von Feder bereits die "Typen- und Funktionsdefinitionen für C, C++ und C#" im Lexikonartikel vorzufinden, an denen ich mich orientiere.
Dazu vllt. vorab ein Hinweis: Es wird darin der Datentyp "byte" verwendet, welcher allerdings bei C und C++ nicht existiert (wenn ich da richtig informiert bin). Als Alternative habe ich bei C "char" gewählt.
Aber nun hier meine *.c-Datei:
- #include <stdio.h>
- typedef void* TComponent; // Nicht verwendbar
- typedef char Boolean; // from "byte" to "char"
- typedef unsigned short Single, *PSingle;
- typedef struct _ShortString {
- char Length; // == min(sizeof(ShortString.String), 256) // from "byte" to "char"
- char String[]; // Nicht-nullterminiert! NUR strncpy o.Ä. anwenden, rennt sonst direkt in unbekannten Speicher!
- } ShortString, *PShortString;
- typedef float Float, *PFloat;
- FILE *file_pointer;
- void __stdcall PluginStart(TComponent Owner)
- {
- // open the file "name_of_file.txt" for writing
- file_pointer = fopen("name_of_file.txt", "w");
- // Write to the file
- fprintf(file_pointer, "PluginStart\n");
- };
- void __stdcall PluginFinalize(void)
- {
- if (file_pointer != NULL) {
- fprintf(file_pointer, "PluginFinalize\n");
- // Close the file
- fclose(file_pointer);
- }
- };
- void __stdcall ReceiveVarFloat(Single VarIndex, Float *Value)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "ReceiveVarFloat\n");
- };
- void __stdcall ReceiveVarBool(Single VarIndex, Boolean *Value)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "ReceiveVarBool\n");
- };
- void __stdcall ReceiveVarInt(Single VarIndex, int *Value)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "ReceiveVarInt\n");
- };
- void __stdcall OnConnectingVehicle(ShortString *Name)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "OnConnectingVehicle\n");
- };
- void __stdcall OnUnconnectingVehicle(void)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "OnUnconnectingVehicle\n");
- };
- Boolean __stdcall SetButton(Single Eventindex)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "SetButton\n");
- return 0;
- };
- PFloat __stdcall SetFloat(Single EventIndex)
- {
- if (file_pointer != NULL)
- fprintf(file_pointer, "SetFloat\n");
- return 0;
- };
Die Solution mit dieser C-Datei habe ich mit Visual Studio "gebuildet" (im Debug-Build-Modus! und x86) und so die *.dll-Datei erhalten. Danach entsprechend in den Ordner "Plugins" im LOTUS-Hauptverzeichnis kopiert und die *.ini-Datei aus Lexikon hinzugefügt:
Normalerweise müsste der obige Quellcode dazu führen, dass eine Textdatei erstellt wird und bei jedem Funktionsaufruf gefüllt wird.
Die Datei finde ich allerdings nirgendwo (müsste ja eigentlich irgendwo im LOTUS-Ordner erscheinen).
Ich habe nochmal meine Logfiles angehangen, ich bin mir nicht sicher, ob man da Informationen zum Plugin vorfindet.
Anbei vllt. noch zwei weitere Fragen:
-C# und C++ sind objektorientiert, also müssen die Funktionen in irgendeine Klasse gepackt werden... Wo sucht LOTUS nach den Funktionen? In der als Entrypoint definierten Klasse?
-In C# existiert kein "typedef". Sollen dann Klassen für die nicht vorhandenen Objekte angelegt werden?
Viele Grüße