AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...
Thema durchsuchen
Ansicht
Themen-Optionen

Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

Ein Thema von s-off · begonnen am 28. Mai 2021 · letzter Beitrag vom 31. Mai 2021
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#1

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 18:12
Zitat:
ich habe mich lange Zeit nicht mehr mit Delphi beschäftigt und stehe nun vor einem Problem
So lange, dass dein Compiler damals noch ANSI war (<2009), aber nun Er mit Unicode arbeitet (2009+) und dein Code durch so Dinge wie String/PChar/... nun nicht mehr das Selbe macht?

Zitat:
CoTaskMemAlloc((Length(FOutputStreamInt.DataString) + 1));
Irgendwie sieht das eher nach ANSI aus, anstatt nach Unicode.

Ich seh ein PChar ... bei externen APIs arbeitet man niemals mit dyniamischen Typen!
PWideChar oder PAnsiChar

Und warum seh ich irgendwie nirgendwo etwas von BSTR/WideString?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Mai 2021 um 18:16 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 18:33
Genau wegen deiner Problem habe ich eine Wrapper.dll in C# geschrieben die man einfach als Verweis in C# einbinden kann.

Diese regelt dann die Kommunikation zwischen der Delphi.dll -> Wrapper.dll - Anwendung in C#.

Somit konnte ich auf beide Varianten des Codes Einfluß nehmen (UnmanagedType und managedType)
Zudem habe ich alle Strings aus Delphi als PWideChar übergeben. Nicht als PChar !

Delphi..
Pluginfile : PWideChar;

C# Wrapper
Code:
    [MarshalAs(UnmanagedType.BStr)]
    public string PluginFile = string.Empty;
Nur so als Anregung.
Zitat:
Achte darauf, das du auch einen Unicode-String in Form von PWideChars zurückgibst, das erspart dir weitere Kopfschmerzen: In C# ist jeder String automatisch Unicode.
https://im-coder.com/wie-verwenden-v...-typ-in-c.html
OK bin raus

Geändert von venice2 (29. Mai 2021 um 18:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#3

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 20:09
Wenn in C# ein BSTR, warum dann in Delphi ein PWideChar, anstatt eines WideString? (WideString ist intern ein BSTR)

Die Delphi-DLL wird überarbeitet?
Wozu dann noch ein Wrapper dazwischen, anstatt direkt?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
s-off

Registriert seit: 20. Jan 2010
89 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 20:26
Hi Himitsu,
Zitat:
ich habe mich lange Zeit nicht mehr mit Delphi beschäftigt und stehe nun vor einem Problem
So lange, dass dein Compiler damals noch ANSI war (<2009), aber nun Er mit Unicode arbeitet (2009+) und dein Code durch so Dinge wie String/PChar/... nun nicht mehr das Selbe macht?
Ganz genau das ist das Problem

Zitat:
CoTaskMemAlloc((Length(FOutputStreamInt.DataString) + 1));
Irgendwie sieht das eher nach ANSI aus, anstatt nach Unicode.
Ich bin so lange raus und es fällt mir sehr schwer, mich in diese alten Strukturen reinzudenken
Gib mir doch mal einen Anschubs, wie das nun mit Unicode funktioniert.


Und warum seh ich irgendwie nirgendwo etwas von BSTR/WideString?
Weil ich nur einige Stellen des Delphi-Codes gepostet habe
Wie gesagt: es geht ausschließlich um den Teil innerhalb der Delphi-DLL.
In C# habe ich das schon mit BSTR deklariert ([MarshalAs(UnmanagedType.BStr)]) und die aufgerufene Routine in der Delphi-Dll verwendet natürlich WideString.
Das schrieb ich ja auch in meinem initialen Beitrag
Zitat:
Ich muss aus C# eine Delphi-DLL mit Parametern (BSTR -> WideString) aufrufen, in der DLL ein PDF erzeugen und dieses base64-decodiert wieder zurückgeben.
**

Achte darauf, das du auch einen Unicode-String in Form von PWideChars zurückgibst
Ist in Delphi 10.1 PChar nicht automatisch PWideChar?

Schaue ich mir mal an - besten Dank.
Edit: Ahhhh - wie kann man das auf Englisch umstellen? Da bekommt man ja die Krise bei dieser Übersetzung.

Wenn in C# ein BSTR, warum dann in Delphi ein PWideChar, anstatt eines WideString?
Mache ich ja (siehe oben)

Die Delphi-DLL wird überarbeitet?
Wozu dann noch ein Wrapper dazwischen, anstatt direkt?
Was meinst Du mit Wrapper?
Ich habe einen Webservice, der in C# geschrieben ist.
Dieser soll halt das, was die Delphi-DLL an PDF-Stream erzeugt, an den Caller zurückgeben.
Das ist der ganze Zauber.
Gruß
s-off

Geändert von s-off (29. Mai 2021 um 20:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#5

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 20:43
vor D2009 war
String = AnsiString
PChar = PAnsiChar
Char = AnsiChar

seit D2009 sind es
String = UnicodeString
PChar = PWideChar
Char = WideChar


Entweder alle String/PChar/Char explitit auf ANSI ändern, so wie es früher war

oder jetzt so lassen, wie es nun ist, aber dennoch alle Typen auf Unicode/Wide ändern, (sie sind es jetzt schon, aber wie gesagt, niemals dynamische Typen in externen Schnittstellen)
aber beachten, dass Chars dort 2 Byte groß sind, also der Speicher ist doppelt so groß, was auch bei Length/Size beachtet werden muß.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
s-off

Registriert seit: 20. Jan 2010
89 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 29. Mai 2021, 21:02
vor D2009 war
String = AnsiString
PChar = PAnsiChar
Char = AnsiChar

seit D2009 sind es
String = UnicodeString
PChar = PWideChar
Char = WideChar


Entweder alle String/PChar/Char explitit auf ANSI ändern, so wie es früher war

oder jetzt so lassen, wie es nun ist, aber dennoch alle Typen auf Unicode/Wide ändern, (sie sind es jetzt schon, aber wie gesagt, niemals dynamische Typen in externen Schnittstellen)
aber beachten, dass Chars dort 2 Byte groß sind, also der Speicher ist doppelt so groß, was auch bei Length/Size beachtet werden muß.
Alles klar, ich schaue mir das am Montag nochmal im Detail an Besten Dank!
Gruß
s-off
  Mit Zitat antworten Zitat
s-off

Registriert seit: 20. Jan 2010
89 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Weitergabe eines Strings über Pointer funktioniert nicht - manchmal...

  Alt 31. Mai 2021, 11:39
Hallo zusammen,

kurze Rückmeldung: es funktioniert nun wie gewünscht.

Ich habe aus PChar einen PWideChar gemacht und aus CoTaskMemAlloc und Move wurde WideStrAlloc und StringToWideChar.
Des Weiteren habe ich zum Rückschreiben des PWideChar in den String die SetString-Methode benutzt.
Nun ist alles lecker.


Vielen Dank nochmals an alle Tippgeber!
Gruß
s-off

Geändert von s-off (31. Mai 2021 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz