Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   MMF lässt sich nicht wiederfinden (https://www.delphipraxis.net/165133-mmf-laesst-sich-nicht-wiederfinden.html)

sansimarkus 15. Dez 2011 16:59

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:
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;
testweise habe ich versuch das ganze auch wieder (im selben thread) anschließend wieder auszulesen, bekomme aber immer den wert 0 zurück:


Delphi-Quellcode:
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;
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).

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:

If the object exists before the function call, the function returns a handle to the existing object (with its current size, not the specified size), and GetLastError returns ERROR_ALREADY_EXISTS.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.
-msdn

Das ganze läuft in einer Konsolenanwendung und ich benutze (leider noch) Delphi 6 unter Windows7 x64.

SirThornberry 15. Dez 2011 17:14

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.

sansimarkus 15. Dez 2011 17:27

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 14:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz