Einzelnen Beitrag anzeigen

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