![]() |
MMF lässt sich nicht wiederfinden
moin,
ich habe eine ThreadKlasse geschrieben die ein paar Information über sich selbst (hier vereinfacht nur die ThreadID) in eine MMF schreibt - und anhand des Namens somit von anderen Threads meiner Klasse wiederfinden sollen. Realisiert wird dies für jeden Thread beim Start so:
Delphi-Quellcode:
testweise habe ich versuch das ganze auch wieder (im selben thread) anschließend wieder auszulesen, bekomme aber immer den wert 0 zurück:
procedure TTndThread.Execute;
begin SetUpThreadData(); [....] end; function TTndThread.SetUpThreadData(): boolean; var dwResult: DWORD; hFileMapping: THandle; Mem: ^Cardinal; //debug crd: ^Cardinal; begin dwResult := 0; //debug New(crd); crd^ := self.ThreadID; try hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SIZEOF(Cardinal), PChar('test1234')); if hFileMapping <> 0 then begin Mem := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if Assigned(Mem) then begin CopyMemory(Mem, crd, SizeOf(Cardinal)); writeln(inttostr(mem^)+' registered'); UnmapViewOfFile(Mem); end else dwResult := ERROR_INVALID_HANDLE; end else dwResult := ERROR_FILE_INVALID; except RaiseException(0,0,0,nil); end; if dwResult = 0 then result := True else Result := false; Dispose(crd); end;
Delphi-Quellcode:
Es kommt kein Fehler (GetLastError = 0) und es sollte so (da mehr oder weniger copy&pasted) funktionieren - aber nach MapViewOfFile zeigt Mem immer auf eine NEUE MMF - dass erfahre ich daher, dass CreateFileMapping einer bereits registrierten MMF einen SystemFehler verursachen sollte (GetLastError sollte nach dem öffnen per CreateFileMapping einer bereits existenten MMF ERROR_ALREADY_EXISTS zurückliefern - gibt aber ERROR_SUCCESS bzw 0 zurück).
function TTndThread.GetThreadID(): Cardinal;
var hFileMapping: THandle; Mem: ^Cardinal; begin result := INFINITE; hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, sizeof(Cardinal), Pchar('test1234')); if hFileMapping <> 0 then begin Mem := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if Assigned(Mem) then begin Result := mem^; UnmapViewOfFile(Mem); CloseHandle(hFileMapping); end else Result := INFINITE; end else Result := INFINITE; if GetLastError <> ERROR_ALREADY_EXISTS then RaiseException(0,0,0,nil); end; Habe das ganze auch vorher mit einem Record und einem Pointer darauf versucht anstatt Cardinal und ^Cardinal. Gleiches Ergebnis; strings bleiben leer, boolsche Werte false und alles andere auch 0. Zitat:
Das ganze läuft in einer Konsolenanwendung und ich benutze (leider noch) Delphi 6 unter Windows7 x64. |
AW: MMF lässt sich nicht wiederfinden
Das MMF ist nur so lange gültig wie mindestens ein Handle darauf existiert. Wenn du das MMF öffnest und danach das Handle schließt ist auch das MMF weg.
|
AW: MMF lässt sich nicht wiederfinden
äh, ja. das hätte ich mir auch denken können, mist.
vielen dank für die antwort! nun funktionierts. Ich berichtige es im ersten Post damit niemand per copy&paste vor dem selben Problem steht. mfg markus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz