Entwickler-Ecke

Windows API - MMF mit Win 7 und 8 bringt Zugriffsverletzung


Adrian - Mi 22.05.13 08:32
Titel: MMF mit Win 7 und 8 bringt Zugriffsverletzung
Servus!

Vor einigen Jahren erstellte ich für eine Kollegen ein Programm, das via MMF Daten von einem zweiten Programm empfing. Das wurde dann von ihm, wie geplant, weitergegeben und von mehreren Leuten in einem Hobbyprojekt nahezu weltweit erfolgreich eingesetzt.
Nun mehren sich die Meldungen, daß es unter Win7 und Win8 zu Problemen kommt. In den Abständen, in denen eigentlich die Daten abgefragt werden sollten, werden Zugriffsverletzungen angezeigt. Das Problem besteht jedoch nicht allgemein, ich kann den Fehler beispielsweise nicht nachvollziehen. Unter WinXP gab es anscheinend keine Schwierigkeiten.
Vielleicht könnte jemand der sich gut in der Materie auskennt, den nachfolgenden Programmausschnitt ansehen und auf mögliche Fehlerquellen hin abklopfen. Ich bin nämlich ratlos.

Danke!

Gruß,

Oiner


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
unit DemoUnit;

type
  PSharedHypeData = ^TSharedHypeData;
  TSharedHypeData = record
    SlotStarted:    Array [0..39of Integer;
    RemoteShutdown: Array [0..39of Integer;
    SlotData:       Array [0..39of Integer;
    axis :          Array [0..5]  of Integer ;
    PositionX :     Integer;
    PositionY :     Integer;
    SavePosition :  Array [0..39of Integer;
    MoveAll :       Integer;
    Sync :          Array [0..39of Integer;
end;

var
  g_SharedHypeData: TSharedHypeData;
  aFileHandle: THandle;
  pViewData: PSharedHypeData;

implementation

procedure TForm1.MMF_Vorbereitung;
begin
  aFileHandle:= OpenFileMapping( FILE_MAP_READ,
                                 False,
                                 'Global\xsimgaugeslot');
  if aFileHandle= INVALID_HANDLE_VALUE then
    raise Exception.Create('Handle-Fehler');
  try
    GetMem(pViewData, SizeOf(LongInt));
    pViewData:= MapViewOfFile( aFileHandle,
                               FILE_MAP_READ,
                               0,
                               0,
                               0);
    if pViewData= nil then
    begin
      Timer1.Enabled:= False;
      with TrackBarPanel do
      begin
        Visible:= True;
        Top:= 0;
        Left:= 0;
      end;
      raise Exception.Create('MapViewOfFile-Fehler'+#13+#10+
                             'manuelle Steuerung aktiviert');
    end;
  finally
  end;
end;

procedure TForm1.MMF_Lesen;
begin
  EAC1TrackBar.Position:=pViewData^.axis[0];
  EAC2TrackBar.Position:=pViewData^.axis[1];
  Application.ProcessMessages;
end;



Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 22.05.2013 um 11:13


Martok - Mi 22.05.13 22:15

Sieht erstmal nichts falsch aus, zumal eh nur zum Lesen gemappt wird. Da kann eigentlich nicht viel passieren...

Ist es denn wirklich eine Exception dabei (müsste dann auch "read of adress..." sein) und nicht bei irgendwas anderem, z.B. beim reinschreiben auf der anderen Seite?
Ein bisschen komisch ist das ab und zu mal wenn das System nach Standby oder Suspend wieder aufwacht, aber da hatte ich eher unter XP Probleme die dann in 7 nicht mehr existierten.


Boldar - Mi 22.05.13 22:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    GetMem(pViewData, SizeOf(LongInt));
    pViewData:= MapViewOfFile( aFileHandle,
                               FILE_MAP_READ,
                               0,
                               0,
                               0);

Meiner Ansicht nach ist das GetMem überflüssug. Oder meinst du vielleicht

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    GetMem(pViewData, SizeOf(LongInt));
    pViewData^:= MapViewOfFile( aFileHandle,
                               FILE_MAP_READ,
                               0,
                               0,
                               0);

?