Danke für Eure Mithilfe aber
bei mir klappt es noch nicht.
Delphi-Quellcode:
unit UPChar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
lbOut: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
FValue:
String;
public
{ Public-Deklarationen }
procedure GetValue(p: PChar);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var pc: PChar;
begin
FValue := Edit1.Text;
GetValue(@pc);
lbOut.Caption := StrPas(pc);
//Freemem(pc, Length(FValue) + 8 + 1);
//Hier ungültige Zeifer Operation
//wer slso gibt am Ende den Speicher wieder frei???
end;
procedure TForm1.GetValue(p: PChar);
begin
getmem(p, Length(FValue) + 8 + 1);
p := PChar(FValue);
end;
end.
Ich erhalte immer noch Datenmüll als Rückgabe.
@Furtbichler:
Wenn ich eine eigene Implementation wählen kann, übergebe ich sowas als call by reference.
Wenn ich aber auf ein Interface zugreifen will/muss und der das Interface festgelegt hat hat eine Get Methode mit dem Übergabeparameter call by value definiert, dann habe ich leider keine Wahl, dann muss die Wertübergaben eben damit funktionieren.
Ich habe dem PChar Parameter jetzt Speicher zugewiesen und dann erst den Wert übergeben. Dennoch erhalte ich Datenmüll.
Ich hab mir mal interessehalber das OpenTools
API angeschaut
Zum Beispiel hier:
Delphi-Quellcode:
TIEditReader = class(TInterface)
public
function GetText(Position: Longint; Buffer: PChar; Count: Longint): Longint;
virtual; stdcall; abstract;
end;
wollte ich dieses Interface verwenden, hätte ich keine Wahl. Für mich selber würde ich natürlich
var Buffer: PChar definieren. Aber bei einem vorgegebenen Interface???
Deshalb will ich auch hier die Parameterübergabe beherrschen. Get heißt für mich, Wert holen. Also muss das doch irgendwie gehen, sobald es sich bei dem Parameter um einen Zeiger handelt. Aber wie.
Gibt es vielleicht eine Compileroption, die sagt, in diesem Fall keinen Stack FRame anlegen?
Oder gibt es eine andere Lösung?
Wie also kann ich aus der Methode GetValue() den PChar Wert erhalten, analog zur oben aufgeführten Interfacefunktion, die über den Buffer ihren Wert übergibt, obwohl Buffer dort nicht als VAR Parameter definiert ist.
Speicher ist zugewiesen. Klappt auch dann bei mir noch nicht mit der Übergabe, wenn ich entweder sowohl innerhalb der Methode als auch in Button1Click Speicher zuweise und auch nicht, wenn ich das nur in Button1Click mache.
Wenn also Compileroption, welche? (Delphi 7 oder 2006)