Autor Beitrag
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Mi 22.05.13 08:32 
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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 22.05.13 22:36 
ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    GetMem(pViewData, SizeOf(LongInt));
    pViewData^:= MapViewOfFile( aFileHandle,
                               FILE_MAP_READ,
                               0,
                               0,
                               0);

?