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.