Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
630 Beiträge
 
Delphi 11 Alexandria
 
#20

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