Delphi DLL in C++, problem mit ShortString

Hallo!

Ich möchte in einer BCB Anwendung eine in Delphi geschriebene DLL verwenden.
Eine Funktion dieser DLL öffnet eine Datei und rechnet mit einem ShortString der den Dateinamen enthält. Ich habe nun das Problem den FileName aus OpenDialog1->FileName in ein typ umzuwandeln mit der die Funktion aus der DLL umgehen kann.
Ich wäre für Ideen oder Lösungsbeispiele sehr dankbar!

Vielen Dank im voraus!

Gruss Thilo

Hallo Thilo,

Strings mit bis zu 255 Zeichen, bei denen die Länge in Byte 0 steht, sind pascal-spezifisch und sollten in einer DLL für andere Sprachen nicht verwendet werden, bzw nur intern, wenn es sein muss.

Üblich sind die nullterminierten Strings aus C bzw. die Pointer darauf (PChar). Es gibt genügend Umwandlungsroutinen wie StrPCopy oder StrPas. Eine einfache Methode ist auch, eine 0 anzuhängen und die Adresse des Strings + 1 zu übergeben - wenn man Überläufe ausschliessen kann.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Thilo,

Strings mit bis zu 255 Zeichen, bei denen die Länge in Byte 0
steht, sind pascal-spezifisch und sollten in einer DLL für
andere Sprachen nicht verwendet werden, bzw nur intern, wenn
es sein muss.

Üblich sind die nullterminierten Strings aus C bzw. die
Pointer darauf (PChar). Es gibt genügend Umwandlungsroutinen
wie StrPCopy oder StrPas. Eine einfache Methode ist auch, eine
0 anzuhängen und die Adresse des Strings + 1 zu übergeben -
wenn man Überläufe ausschliessen kann.

Gruss Reinhard

Vielen Dank erstmal für die schnelle Antwort! Leider kann ich die DLL nicht ändern und muss nun versuchen damit klar zu kommen.
Gibt es denn eine Möglichkeit der Typumwandlung von AnsiString, den mir der OpenDialog1->FileName liefert in ein ShortString ähnliches Format womit die Funktion der DLL umgehen kann?

Gruss Thilo

Vielen Dank erstmal für die schnelle Antwort! Leider kann ich
die DLL nicht ändern und muss nun versuchen damit klar zu
kommen.
Gibt es denn eine Möglichkeit der Typumwandlung von
AnsiString, den mir der OpenDialog1->FileName liefert in
ein ShortString ähnliches Format womit die Funktion der DLL
umgehen kann?

Hallo Thilo,

ich weiss nicht, ob sich schon jemand die Mühe gemacht, hat naheliegend wäre es. Es ist aber auch so kein Problem:

Man nehme einen char array mit 257 char, verwendet ihn aber erst ab Position 1 für nullterminierte Strings bis 255 char Länge.

Vor Übergabe an Pascal bestimmt man die aktuelle Stringlänge und trägt sie in das 0te Byte ein, dessen(!) Adresse übergibt man an die Pascal-Routine.

Nach Rückkehr von Pascal entnimmt man die aktuelle Stringlänge aus Byte 0 und füllt das char-array ab Pos 1 entsprechend mit 0 auf (es genügt auch eine 0).

Gruss Reinhard

Hallo Thilo,

ich weiss nicht, ob sich schon jemand die Mühe gemacht, hat
naheliegend wäre es. Es ist aber auch so kein Problem:

Man nehme einen char array mit 257 char, verwendet ihn aber
erst ab Position 1 für nullterminierte Strings bis 255 char
Länge.

Vor Übergabe an Pascal bestimmt man die aktuelle Stringlänge
und trägt sie in das 0te Byte ein, dessen(!) Adresse übergibt
man an die Pascal-Routine.

Nach Rückkehr von Pascal entnimmt man die aktuelle Stringlänge
aus Byte 0 und füllt das char-array ab Pos 1 entsprechend mit
0 auf (es genügt auch eine 0).

Gruss Reinhard

Hallo Reinhard,

vielen Dank für den Vorschlag aber leider komm ich mit der Umsetzung nicht ganz zurecht. Leider will die Funktion mein Dateinamen aus dem OpenDialog1->FileName immer noch nicht verarbeiten.
Die Vorraussetzungen sind Folgende:

Definition der Funktion aus der DLL in der Headerdatei:

extern „C“ __declspec(dllimport) long __stdcall OpenDataFile(char &FileName) //Ist das mit dem Adressoperator so OK?

Der FileName ist in der orginal DelphiDLL vom Typ ShortString

Wie muss denn nun der Code aussehen damit ich den OpenDialog1.FileName an meine OpenDataFile-Funktion übergeben kann? Ich hoffe das macht keine zu großen Umstände, ich hab grade schon rumprobiert bin aber leider noch nicht so fit in C++.
Vielen Dank für die Hilfe

Gruss Thilo

Juhuu… ich habs geschafft! Nochmal danke für die Hilfe!

Gruss Thilo