AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

MMF lässt sich nicht wiederfinden

Ein Thema von sansimarkus · begonnen am 15. Dez 2011 · letzter Beitrag vom 15. Dez 2011
Antwort Antwort
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#1

MMF lässt sich nicht wiederfinden

  Alt 15. Dez 2011, 16:59
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.

Geändert von sansimarkus (15. Dez 2011 um 17:30 Uhr) Grund: korrektur
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: MMF lässt sich nicht wiederfinden

  Alt 15. Dez 2011, 17:14
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#3

AW: MMF lässt sich nicht wiederfinden

  Alt 15. Dez 2011, 17:27
ä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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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