AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MMF lässt sich nicht wiederfinden

Ein Thema von sansimarkus · begonnen am 15. Dez 2011 · letzter Beitrag vom 15. Dez 2011
 
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
 


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 01:28 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