Einzelnen Beitrag anzeigen

ekke

Registriert seit: 14. Nov 2009
18 Beiträge
 
#5

Re: Problem String (PAnsiChar) Parameter in Com Server Anwen

  Alt 16. Nov 2009, 13:17
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
Angehängte Dateien
Dateityp: zip compchartest_192.zip (4,2 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat