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