Einzelnen Beitrag anzeigen

Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#3

Re: Unbegrenzt viele Nachkommastellen

  Alt 23. Okt 2004, 16:50
Hi Hagen

hm... bei dir sieht das mal wieder so spielend einfach aus^^
mein problem war das ich nicht wußte wie ich das self mit in den funktionsaufruf einbauen soll
ich hatte das mit der VMT etwas anders gemacht

also das soll ein versuchs-interface zu einem string sein
hab mal bisel ordnung und struktur in alles gebracht.... aber im prinzip noch genauso wie vorher
Delphi-Quellcode:
 // Das String Interface
  IString = Interface(IInterface)
    function IS_GetString: String;
    procedure IS_SetString(AString: String);
    function IS_GetRefCount: Integer;
    property RefCount: Integer read IS_GetRefCount ;
    property AString: String read IS_GetString write IS_SetString;
  end;

  // Die VMT für das String Interface
  PStringVMT = ^TStringVMT;
  TStringVMT = packed record
    QueryInterface: Pointer;
    AddRef: Pointer;
    Release: Pointer;
    GetString: Pointer;
    SetString: Pointer;
    GetRefCount: Pointer;
  end;

  // Der Record für das String Interface
  PStringIntf = ^TStringIntf;
  TStringIntf = packed record
    StringVMT: PStringVMT;
    RefCount: Integer;
    AString: String;
  end;

procedure StringInit(var Dest: IString);
function IS_QueryInterface(Self: Pointer; const IID: TGUID; out Obj): HResult; stdcall;
function IS_AddRef(Self: Pointer): Integer; stdcall;
function IS_Release(Self: Pointer): Integer; stdcall;
function IS_GetString: String;
procedure IS_SetString(AString: String);
function IS_GetRefCount: Integer;

const
  // Die VMT für IString fertig Initialisiert
  ISGlobalVMT: TStringVMT = (
    QueryInterface: @IS_QueryInterface;
    AddRef: @IS_AddRef;
    Release: @IS_Release;
    GetString: @IS_GetString;
    SetString: @IS_SetString;
    GetRefCount: @IS_GetRefCount);

implementation

procedure IS_SetString(AString: String);
// stdcall: [ebp+$04] RücksprungAdresse
// [ebp+$08] Self(pointer auf interfacerecord)
// [ebp+$0c] String
// register: EDX String, EAX Self
// todo
// strings copy
// wenn refcount > 1 dann copy on demand
asm
  PUSH EAX // self sichern
  LEA EAX, [EAX+$08] // Dest String nach EAX
  PUSH EDX // Src String sichern
  MOV EDX, ESP // Zeiger auf Src
  CALL IS_LStrAsg // procedure IS_LStrAsg(var dest; const source);


  usw.....
mein problem war das ich die funktionen so wie bei normalen objekten realisieren wollte.... und da gabs probleme mit dem self
im interface wird SetString ohne Self deklariert.... aber die eigentliche funktion muß mit self implementiert werden... aber ich habe beides gleich ohne self gehabt.... war irgendwie ein riesiger denkfehler von mir

naja, aber jetzt geht es einwandfrei *freu*
vielen dank Hagen

allerdings hatte ich mir mit dem string als test selber einen gemacht.... weil der compiler selber diverse stringumwandlungen einbaut und dabei unterscheidet woher der string kommt ob global... local... aus dynamischen resourcen(dll...) oder aus dem code,
und das müßte ich alles selber mit asm einbauen um die sicherheit zu geben das ein string nicht freigegeben wird der nicht freigegeben werden darf....

aber bei deiner variante kümmert sich der compiler wieder selber um alles

mfg Dano
  Mit Zitat antworten Zitat