Hey,
so langsam zweifele ich an meinen Fähigkeiten. Folgende
Unit hatte ich mir gebastelt:
Delphi-Quellcode:
procedure WriteToMMF(Filename: PChar; Data: Pointer; Len: Int64);
var
hFile: Cardinal;
Mem: Pointer;
begin
hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Len, Filename);
if hFile <> 0 then
begin
try
Mem := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);
if Assigned(Mem) then
begin
try
CopyMemory(Mem, Data, Len);
finally
//UnmapViewOfFile(Mem);
end;
end;
finally
//CloseHandle(hFile);
end;
end;
end;
function ReadFromMMF(Filename: PChar; Len: Int64): Pointer;
var
hFile: Cardinal;
begin
hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, Len, Filename);
if hFile <> 0 then
begin
try
Result := MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 0);
finally
//CloseHandle(hFile);
end;
end
else
begin
Result := nil;
end;
end;
procedure WriteMMFString(Filename: PChar; Value: String);
var
Buf: Pointer;
Len: Int64;
hMem: Cardinal;
begin
Len := Length(Value);
hMem := GlobalAlloc(GPTR, Len + SizeOf(Int64));
Buf := GlobalLock(hMem);
try
CopyMemory(Buf, @Len, SizeOf(Int64));
CopyMemory(Pointer(Cardinal(Buf) + SizeOf(Int64)), @Value[1], Len);
WriteToMMF(Filename, Buf, Len + SizeOf(Int64));
finally
GlobalUnlock(hMem);
GlobalFree(hMem);
end;
end;
function ReadMMFString(Filename: PChar; var Len: Int64): Pointer;
var
Data: Pointer;
begin
Result := nil;
Data := ReadFromMMF(Filename, SizeOf(Int64));
try
if Assigned(Data) then
begin
Len := Cardinal(Data^);
Data := ReadFromMMF(Filename, SizeOf(Int64) + Len);
try
if Assigned(Data) then
begin
Result := GlobalLock(GlobalAlloc(GPTR, Len));
CopyMemory(Result, Pointer(Cardinal(Data) + SizeOf(Int64)), Len);
end;
finally
//UnmapViewOfFile(Data);
end;
end;
finally
//UnmapViewOfFile(Data);
end;
end;
Anwendung [1] schreibt nun mittels WriteMMFString mehrere String und mittels WriteToMMF einen Cardinal. Anwendung [2] ließt nun mittels ReadMMFString die Strings wieder aus und mittels ReadFromMMF den Cardinal. Das Problem ist folgendes: Mindestens einer der Werte wird nicht ausgelesen. Es wird allerhöchstens 00 zurückgegeben.
Irgendwie scheine ich das Prinzip aber auch noch nicht ganz verstanden zu haben. Die auskommentierten Befehle darf ich nicht aufrufen, weil sonst schonmal direkt überhauptnichts ankommt.
Das Problem ist auch, dass Anwendung [2] normalerweise permanent läuft. Gebe ich also die Mappings nicht wieder frei gibt es irgendwann Durcheinander bei den Daten die gelesen werden. Auch schreibt Anwendung [1] einen der Strings in einem festen Interval neu, da sich dieser auch laufend ändert.
Hat jemand eine Idee wie man das Problem lösen kann?
Gruß