Moin,
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.
[...]
-In C# existiert kein "typedef". Sollen dann Klassen für die nicht vorhandenen Objekte angelegt werden?
"byte" gibt es in C als Grundtype nicht, aber mit "typedef unsigned char byte" gibt es byte plötzlich doch. ;-)
"unsigned char" ist aber völlig in Ordnung, genau wie (wenn <windows.h> eh dabei ist) "BYTE". (was es eigentlich sein sollte, auweiha)
Nein, einfach typedef weglassen und nur "struct" verwenden. ShortString ist eine reine Datenstruktur, keine Klasse.
Die exportierten Funktionsnamen der DLL sind schon korrekt, oder? Gerade Visual Studio ziert sich manchmal, name-mangling zu deaktivieren. Das kannst du z.B. damit einfach prüfen. Einfach die DLL in das Fenster ziehen, im zweiten Fenster rechts müssten dann alle exportieren Funktionen korrekt aufgelistet werden.
Zitat von Captain Vimes
(für mich z.T. unverständlichen)
Bis auf ShortString kann man die typedefs natürlich auch weglassen und gleich die Grundtypen verwenden. Der Hintergrundgedanke war, dass es dadurch leichter wird, Delphi-Codebeispiele nach C zu portieren.
Da gibt es ja einige Fallstricke, mit der <windows.h> wird ja gerne (pre-C99) BOOL verwendet, was aber nicht unsigned char ist - sondern int. :-)
(Wobei ich gerade merke, dass da auch statt "Single" eigentlich "Word" stehen sollte...)
- typedef void* TComponent;
- typedef unsigned char Byte;
- typedef Byte Boolean;
- typedef unsigned short Word, *PWord;
- typedef struct _ShortString {
- Byte Length; // == min(sizeof(ShortString.String), 256)
- char String[]; // Nicht-nullterminiert! NUR strncpy o.Ä. anwenden, rennt sonst direkt in unbekannten Speicher!
- } ShortString, *PShortString;
- typedef float Float, *PFloat;
- void __stdcall PluginStart(TComponent Owner);
- void __stdcall PluginFinalize(void);
- void __stdcall ReceiveVarFloat(Word VarIndex, Float Value);
- void __stdcall ReceiveVarBool(Word VarIndex, Boolean Value);
- void __stdcall ReceiveVarInt(Word VarIndex, int Value);
- void __stdcall OnConnectingVehicle(ShortString *Name);
- void __stdcall OnUnconnectingVehicle(void);
- Boolean __stdcall SetButton(Word Eventindex);
- Float __stdcall SetFloat(Word EventIndex);
Alles anzeigen
- PluginStart
- Connected with vehicle GT6N
- Unconnected vehicle
- Connected with vehicle GT6Nô
- Unconnected vehicle
Wobei daraus auch ersichtlich ist, dass char* für shortstring noch nicht das Wahre ist. 
Richtig, sonst läufst du da einfach in den Speicher hinter dem String bis zum ersten zufälligen Nullbyte. Ein Delphi-ShortString ist so aufgebaut:
[Länge, immer ein Byte][Eigentlicher String]
Beispiel: ("FF" stellt den restlichen Speicher da)
Meldet LOTUS als String "DüWag GT8" zeigt der Pointer nicht auf folgendes:
[..] FF FF FF 44 fc 57 61 67 20 47 54 38 00 FF FF FF [...]
Sondern:
[..] FF FF FF 09 44 fc 57 61 67 20 47 54 38 FF FF FF [...]
Das erste Byte ist die Länge des nachfolgenden Strings. Da die Länge immer relativ kurz ist, wird beim ersten Byte immer ein nicht-druckbares Steuerzeichen rauskommen.
Der String ist aber NICHT Nullterminiert. Das ist KEINE C-Zeichenkette.
Viele Grüße