Vorneweg, es geht auch mit WideChar nicht
Ich habe mal ein kleines Testprogramm gebastelt, um die Details zu erforschen.
Ich vermute, das die Rückgabe mittels PChar/PWideChar nicht gehen kann, weil die Datenlänge dynamisch ist. Ist halt seltsam das die Daten tatsächlich ohne Fehler übertragen werden.
Zum Nachvollziehen: Beide Apps kompilieren, dann den Server in Delphi starten, Break point in die beiden Proceduren setzen, den Client starten und jeweils einen Button (Button1, Button2) betätigen.
Nach Verlassen der Server procedure(n) kommt das CPU Fenster hoch, mit F9 weiterlaufen lassen, Ergebnis steht im Client
Achso: Compiler D7 prof.
D2009 zeigt das gleiche Verhalten, allerdings hatte ich dort die "ein Byte"-Variante auskommentiert, also nur die WideChar variante probiert
Server Code
Delphi-Quellcode:
TCharServer = class(TAutoObject, ICharServer)
private
TheReturnString : String;
TheReturnWString : WideString;
...
Delphi-Quellcode:
procedure TCharServer.GetPChar(InputValue: PChar; out OutputValue: PChar);
begin
TheReturnString := FormatDateTime('HH:nn:ss-zzz',Now);
OutputValue := PAnsiChar(TheReturnString);
end; // <<----- hier passiert der Fehler (Debugger CPU Fenster)
procedure TCharServer.GetPWideChar(InputValue: PWideChar;
out OutputValue: PWideChar);
begin
TheReturnWString := FormatDateTime('HH:nn:ss-zzz',Now);
OutputValue := PWideChar(TheReturnWString);
end; // <<----- hier passiert der gleiche Fehler (Debugger CPU Fenster)
Client Code
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
FServer := CoCharServer.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p : PAnsiChar;
begin
p := Nil;
FServer.GetPChar('Hallo',p);
if Assigned(p) then
Memo1.Lines.Add(p)
end;
procedure TForm1.Button2Click(Sender: TObject);
var
p : PWideChar;
begin
p := Nil;
FServer.GetPWideChar('Hallo',p);
if Assigned(p) then
Memo1.Lines.Add(p)
end;
Gruß Ekkehard