AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Delphi DLL String übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi DLL String übergeben

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

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 10:31
Ups

Das im Programm habe ich falsch dargestellt. Das sieht so aus...

Delphi-Quellcode:
var
  Antwort :array of Char;

procedure TfMain.btnGetTxtClick(Sender: TObject);
var
  line :WideString;
begin
    SetLength(Antwort,StrToInt(edtTextLen.Text));
    GetTxt(@Antwort,StrToInt(edtTextLen.Text));
    SetString(line,PWideChar(@Antwort[1]),StrToInt(edtTextLen.Text)); //Length(Antwort));
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 15:03
dynamisches Array:

@Antwort ist ein Zeiger auf die Variable, nicht auf die Daten.
@Antwort[0] ist ein Zeiger auf das erste Char, bzw. auf alle Chars im Array.

Wie gesagt, mach doch einfach procedure GetTxt(var A: WideString; L: Integer); cdecl; und lass das ganze Rumgepointere sein.

Delphi-Quellcode:
procedure GetTxt(var A: WideString; L: Integer); cdecl;
var
  i :Integer;
begin
  ...
  A := Answer;
end;
Dann kann auch diese beschissene globale Variable weg.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mär 2024 um 15:07 Uhr)
  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 28. Mär 2024, 15:06
Hi,
danke dir habe es auf stdcall umgestellt. Läuft nun. Natürlich ohne Pointer
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 28. Mär 2024, 15:48
Du kannst ganz normal mit Strings arbeiten und benötigst kein Array of Char. Der Compiler nimmt dir da sehr viel Konvertierungsarbeit ab, wenn du es richtig machst. Ausserdem ist dir anscheinend nicht recht klar was der Unterschied von Unicode und Ansi ist. In Ansi (D2007) ist eine Zeichen (Char) ein Byte. Bei Unicode ist ein Zeichen (Char) 2 Byte. Du kannst also bei einem Speicher Movebefehl nicht einfach die Länge des String nehmen, da das dann zu wenig Speicher ist.

Move(Answer,A^,Length(Answer)); Das ist devinitv in der DLL falsch. Length(Answer) liefet dir die Anzahl Zeichen in Answer, aber du benötigst die Anzahl Bytes. Das muss daher so sein:
Move(Answer[1],A[0],Length(Answer) * SizeOf(Char)); Leider ist mir nicht mehr so recht klar, was du nun wo genau machst. Die DLL ist immer noch mit D10.4 geschrieben? Wenn ja darfst du da keine WideStrings nutzen sondern ganz normal mit String und Char arbeiten. WideString und PWideChar bezieht sich nur auf D2007.

D10.4 DLL:
Delphi-Quellcode:
var
  Answer :String;

procedure GetTxt(A:PChar;L:Integer); cdecl;
var
  i :Integer;
  
begin
    Answer:=StringOfChar('A', L);
    SetLength(A, L);
    Move(Answer[1],A[0],Length(Answer) * SizeOf(Char)); // benötigen hier Bytes nicht Zeichen!!!
end;
D2007 Anwendung:
Delphi-Quellcode:
var
  Antwort :String; // Dein D2007 kann in den TEdits, etc. eh kein Unicode nutzen, da macht es keinen Sinn mit WideString als Resultat.

procedure TfMain.btnGetTxtClick(Sender: TObject);
var
  wAntwort: Array of PWideChar;
begin
    SetLength(wAntwort,StrToInt(edtTextLen.Text));
    GetTxt(wAntwort[0],StrToInt(edtTextLen.Text));
    Antwort := String(WideString(wAntwort)); // Eventuell geht es auch nur mit String(wAntwort)

Geändert von Rolf Frei (28. Mär 2024 um 15:51 Uhr)
  Mit Zitat antworten Zitat
DelTurbo

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 15:51
Danke, aber ich habe das schon geändert. Guck hier
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 16:00
Du kannst auch einfach WideString verwenden und das einfach als Rückgabewert verwenden. Anders als für Strings brauchst du da nicht ShareMem, womit du dir nur unnötige Probleme und Einschränkungen schaffst (geht nur mit Delphi, Probleme bei unterschiedlichen Delphiversionen, ...).
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi DLL String übergeben

  Alt 28. Mär 2024, 20:02
Wie schon erwähnt, brauchst du für WideString und OleVariant (nicht Variant) kein ShareMem/SimpleShareMem, da hierfür bereits eine externe Speicherverwaltung genutzt wird.


@Rolf: Für externe Schnittstellen, wie z.B. DLLs, am Besten niemals dynamische Typen verwenden, also kein Char, PChar oder String, sondern nur statische Typen, wie z.B. PWideChar/PAnsiChar oder WideString.

Rate mal, warum es damals 2009 fast überall geknallt hatte.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mär 2024 um 20:06 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 20:35 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