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)