AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Delphi DLL String übergeben

Delphi DLL String übergeben

Ein Thema von DelTurbo · begonnen am 25. Mär 2024 · letzter Beitrag vom 28. Mär 2024
Antwort Antwort
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 13:48
Das Problem wird sein, dass D2007 (ANSI) und D10.4 (Unicode) nicht die gleiche Definition von PChar haben. Früher zeigte ein PChar auf ein Byte (Zeichen) und seit D2009 auf 2 Bytes = 1 Zeichen. Du musst deshalb sicherstellen, dass beide Delphis die Daten auf die gleiche Weise verarbeiten, also Ansi oder Unicode.

Deklariere mal in D10.4 die DLL Funktion so:

function ConnectApi(Key: PAnsiChar):Boolean; cdecl;

Die Routine in 10.4 muss dann den String entsrechend verarbeiten und als AnsiString übergeben.

Wenn du das umgekehrte machen willst, muss du in D2007 einen WideString als PWideChar übergeben. Das müsste auch gehen. Die Deklaration in D2007 müsste dann so sein:

function ConnectApi(Key: PWideChar):Boolean; cdecl;

Beispiel D2007:
Delphi-Quellcode:
var
  s: WideString;
begin
  s := 'mein key';
  ConnectApi(PWideChar(s));
end;
oder so:
Delphi-Quellcode:
var
  s: String;
begin
  s := 'mein key';
  ConnectApi(PWideChar(WideString(s)));
end;

Geändert von Rolf Frei (25. Mär 2024 um 13:56 Uhr)
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#2

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 13:53
Könnte ich auch PAnsiString nehmen? Weil ich ja einen langen String übergeben muss.

Das hat sich überschnitten... Sorry
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 14:01
Das geht. Ich brech ab. WideChar/String ist doch länger als 255, oder? Ich meine der wäre 0 Terminiert.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 14:08
Das geht. Ich brech ab. WideChar/String ist doch länger als 255, oder? Ich meine der wäre 0 Terminiert.
Nur der Datentyp ShotString besteht aus maximal 255 Zeichen, alles andere ist unlimitiert.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 14:07
Zuerst müssen wir wissen, wie es denn nun genau gemacht wird. Bleibt die Deklaration in D1.04 so mit PChar?

function ConnectApi(Key:PChar):Boolean; cdecl; Wenn dem so ist, kannst du es so machen wie in meinem vorherigen Beispiel. Du benötigst für D2007 eine andere Deklaration als in D10.4:
Delphi-Quellcode:
{$IFDEF UNICODE}  // D2009+
function ConnectApi(Key:PChar):Boolean; cdecl
{$ELSE}  // D2007
function ConnectApi(Key:PWideChar):Boolean; cdecl
{$ENDIF}

Zitat:
Könnte ich auch PAnsiString nehmen? Weil ich ja einen langen String übergeben muss.
Das versthe ich nicht so ganz, was du damit meinst? Die länge des String ist im Prinzip egal. PAnsiString würde ich auf keinen Fall nehmen, weil String in D2007 nicht einem String in D10.4 entspricht und das inkompatibel ist.

Geändert von Rolf Frei (25. Mär 2024 um 14:09 Uhr)
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#6

AW: Delphi DLL String übergeben

  Alt 25. Mär 2024, 14:11
Hi,
erstmal danke für deine Hilfe. Ich habe die DLL schon geändert in
function ConnectApi(Key : PWideChar):Boolean; cdecl;

Klappt einwandfrei. Das mit dem Ansi vergiss wieder. Wenn man soooo lange dran sitzt und keinen erfolg hat, dann kommen auch komische Fragen...
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#7

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 09:46
Huhu,
es tut mir leid aber ich muss nochmal "Nerven". Ich hole mir einen String (die Antwort) folgendermaßen aus der DLL. Ist der String 2000 Lang klappt alles. Irgendwo bei 2500 liegt die grenze ab der ich dann komischerweise ein "Out of Memory" bekomme. Also 3000 Zeichen geht gar nicht. Ich versuche mal den Source wo es "knallt" hier zu Posten. Das ist ein kleines Testprogramm, dort kann ich die länge von dem String den haben möchte übergeben.

In der DLL mache ich das...
Delphi-Quellcode:
var
  Answer :WideString;

procedure GetTxt(A:PWideChar;L:Integer); cdecl;
var
  i :Integer;
begin
    Answer:='';
    for i:=0 to L-1 do begin
      Answer:=Answer+'A';
    end;
    Move(Answer,A^,Length(Answer));
end;
Im Programm das...
Delphi-Quellcode:
procedure TfMain.btnGetTxtClick(Sender: TObject);
var
  line :WideString;
begin
    SetLength(Antwort,StrToInt(edtTextLen.Text));
    GetTxt(@Antwort,StrToInt(edtTextLen.Text));
    SetString(line,PWideChar(@Antwort[0]),Length(Antwort)); // hier geht es in die Hose. Wie gesagt ab ca. 2500 Zeichen. Bei 2000 klappt es
end;
Ich habe gestern wie wild gegoogelt aber ich finde nichts. Es spielt auch keine Rolle ob die DLL mit Delphi 10.4 oder 2007 erstellt wurde.

Vielen Dank im voraus
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 09:54
0 ist definitiv falsch

PWideChar(@Antwort[1]) oder besser PWideChar(@Antwort[Low(string)]) (für die kurze Era wo das mal im Mobilen-Delphi ausprobiert wurde)
oder einfach nur direkt PWideChar(Antwort) , denn Ersteres knallt dir bei einem leeren String (Length=0) gnadenlos eine Exception entgegen.
https://docwiki.embarcadero.com/RADS...rings_(Delphi)



Für AnsiString's und UnicodeString/String müsste ShareMem verwendet werden, oder eben als PChar übergeben.

Wenn keine #0 im PChar/PWideChar oder PAnsiChar vorkommen, dann braucht man keine Länge einzeln zu übergeben.
MSDN-Library durchsuchenStrLen

Für WideString geht es geht es auch direkt, da es nicht den DelphiMM benutzt, sondern den MemoryManager vom OLE32
und intern ist es eigentlich ein Bei Google suchenBSTR, wofür automatisch die API um MSDN-Library durchsuchenSysAllocString/SysFreeString verwendet wird, welche auch C++ und Co. nutzen können.
Außerdem nutzt es somit auch eine Art von ShareMem (nur halt nicht das vom Delphi), weswegen es keine Probleme mit DLLs und COM-Interfaces gibt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mär 2024 um 09:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 09:56
hier geht es in die Hose. Wie gesagt ab ca. 2500 Zeichen. Bei 2000 klappt es
Ich wüsste nicht, warum SetString eine Begrenzung haben sollte.

System._UStrFromPWCharLen für String/UnicodeString
System._WStrFromPWCharLen für WideString

[edit]
Arg, wer hat sich denn diesen totalen Schwachsinn ausgedacht?
Für WideString ist SetString komplett im A***

Echt mal, das einfach blind nach UnicodeString zu casten, ist grob fahrlässig ... hatte wohl auch wer mitbekommen und desswegen die Compilerwarnung via Pointer unterdrückt.
[/edit]

[edit2] Neee, das ist nur für Nicht-Windowse (iOS/ISX/Android/Linux), wo WideString heimlich ein UnicodeString ist.



So oder so, warum nimmst du nicht einfach Line := A; und lässt das mit dem Len weg?
Oder eben direkt WideString als Parameter nutzen.
procedure GetTxt(const A: WideString); cdecl;

Und wozu das cdecl? (möglicher Aufruf aus C++ oder so?)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mär 2024 um 10:13 Uhr) Grund: ups
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:07 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