
Wenn ich einen normalen Record in ein MMF schreibe geht es, dann kann ich diesen auf der Empfängerseite auslesen. Setze ich aber genau diesen Record in ein Array und versuche das dann zu lesen kriege ich ganz merkwürdige Fehler, Stack Overflows bis zu Debugger abstürzen. Ich poste mal 2 Versionen, die erste mit einfachem Record und die zweite mit Record im Array, was ist da falsch?
Beispiel: http://www.michael-puff.de/Programmieru ... /MMF.shtml
Achtung bei der funktionierenden Version:
Code: Alles auswählen
PRates = ^TRates;
Code: Alles auswählen
Rates = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
PRates = ^Rates;
Code: Alles auswählen
------ (1) der sender --------------------------------------------------------------------------------------------------
TRates = packed record
time : INT64;
open : Double;
high : Double;
low : Double;
close : Double;
tick_volume : UINT64;
spread : INT32;
real_volume : UINT64;
end;
PRates = ^TRates;
function WriteToMMF(MyData: PRates; Filename: string; hWnd: THandle): DWORD;
var
dwResult: DWORD;
hFileMapping: THandle;
Mem: PRates;
begin
Mem := nil;
dwResult := 0;
hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,PAGE_READWRITE,0,sizeof(TRates),PChar(Filename));
if hFileMapping <> 0 then begin
Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
if Assigned(Mem) then begin
CopyMemory(Mem, MyData, sizeof(TRates));
SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
CloseHandle(hFileMapping);
end;
end else dwResult := GetLastError;
result := dwResult;
end;
function MT4_IPC_Send(const _msg:PWideChar; const _qac:Integer;var _MyQuotes:PQuotes;const _rac:Integer;var _Rates:Rates):boolean;stdcall;
var
res,i : integer;
dwResult : DWORD;
hReceiver: THandle;
MyData : PRates;
begin
SetLastError(0);
hReceiver := FindWindow(nil, 'TReceiver');
if hReceiver <> 0 then begin
MyData := GetMemory(SizeOf(TRates));
try
if Assigned(MyData) then begin
MyData^.time := 1;
MyData^.open :=2;
MyData^.high :=3;
MyData^.low :=4;
MyData^.close :=5;
MyData^.tick_volume:=6;
MyData^.spread :=7;
MyData^.real_volume:=8;
dwResult := WriteToMMF(MyData,'MyFileMapping',hReceiver);
if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));
end;
finally
FreeMemory(MyData);
end;
end else TCPxHnd.IpcLog(SysErrorMessage(GetLastError));
exit(true);
end;
------ (2) der empfänger --------------------------------------------------------------------------------------------------
TRates = packed record
time : INT64;
open : Double;
high : Double;
low : Double;
close : Double;
tick_volume : UINT64;
spread : INT32;
real_volume : UINT64;
end;
PRates = ^TRates;
function ReadFromMMF(Filename: string): TRates;
var
hFileMapping: THandle;
Mem: PRates;
begin
hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY, 0, sizeof(TRates), PChar(Filename));
if hFileMapping <> 0 then begin
Mem := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if Assigned(Mem) then begin
result.time := mem^.time;
result.open := mem^.open;
result.high := mem^.high;
result.low := mem^.low;
result.close := mem^.close;
result.tick_volume := mem^.tick_volume;
result.spread := mem^.spread;
result.real_volume := mem^.real_volume;
end;
end
end;
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
MyData: TRates;
begin
MyData := ReadFromMMF('MyFileMapping');
Edit1.Text := IntToStr (MyData.time);
Edit2.Text := FloatToStr(MyData.open);
Edit3.Text := FloatToStr(MyData.high);
Edit4.Text := FloatToStr(MyData.low);
Edit5.Text := FloatToStr(MyData.close);
Edit6.Text := IntToStr (MyData.tick_volume);
Edit7.Text := IntToStr (MyData.spread);
Edit8.Text := IntToStr (MyData.real_volume);
end;
Code: Alles auswählen
------ (3) der sender lässt sich kompilieren und scheint zu gehen --------------------------------------------------------------------------------------------------
TRates = packed record
time : INT64;
open : Double;
high : Double;
low : Double;
close : Double;
tick_volume : UINT64;
spread : INT32;
real_volume : UINT64;
end;
Rates = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
PRates = ^Rates;
function WriteToMMF(MyData: PRates; Filename: string; hWnd: THandle): DWORD;
var
dwResult: DWORD;
hFileMapping: THandle;
Mem: PRates;
begin
Mem := nil;
dwResult := 0;
hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,PAGE_READWRITE,0,SizeOf(Rates),PChar(Filename));
if hFileMapping <> 0 then begin
Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
if Assigned(Mem) then begin
CopyMemory(Mem,MyData,SizeOf(Rates));
SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
CloseHandle(hFileMapping);
end;
end else dwResult := GetLastError;
result := dwResult;
end;
function MT4_IPC_Send(const _rac:Integer;var _Rates:Rates):boolean;stdcall;
var
res,i : integer;
dwResult : DWORD;
hReceiver: THandle;
MyData : PRates;
begin
SetLastError(0);
hReceiver := FindWindow(nil, 'TReceiver');
if hReceiver <> 0 then begin
MyData := GetMemory(SizeOf(Rates));
try
if Assigned(MyData) then begin
MyData^[0].time := 1;
MyData^[0].open := 2;
MyData^[0].high := 3;
MyData^[0].low := 4;
MyData^[0].close := 5;
MyData^[0].tick_volume := 6;
MyData^[0].spread := 7;
MyData^[0].real_volume := 8;
dwResult := WriteToMMF(MyData,'MyFileMapping',hReceiver);
if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));
end;
finally
FreeMemory(MyData);
end;
end else TCPxHnd.IpcLog(SysErrorMessage(GetLastError));
exit(true);
end;
------ (4) der empfänger --------------------------------------------------------------------------------------------------
TRates = packed record
time : INT64;
open : Double;
high : Double;
low : Double;
close : Double;
tick_volume : UINT64;
spread : INT32;
real_volume : UINT64;
end;
Rates = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
PRates = ^Rates;
function ReadFromMMF(Filename: string): Rates;
var
hFileMapping: THandle;
Mem: PRates;
begin
hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY, 0, SizeOf(Rates), PChar(Filename));
if hFileMapping <> 0 then begin
Mem := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if Assigned(Mem) then begin
result[0].time := mem^[0].time;
result[0].open := mem^[0].open;
result[0].high := mem^[0].high;
result[0].low := mem^[0].low;
result[0].close := mem^[0].close;
result[0].tick_volume := mem^[0].tick_volume;
result[0].spread := mem^[0].spread;
result[0].real_volume := mem^[0].real_volume;
end;
end;
end;
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
MyData: Rates;
begin
MyData := ReadFromMMF('MyFileMapping');
Edit1.Text := IntToStr (MyData[0].time);
Edit2.Text := FloatToStr (MyData[0].open);
Edit3.Text := FloatToStr (MyData[0].high);
Edit4.Text := FloatToStr (MyData[0].low);
Edit5.Text := FloatToStr (MyData[0].close);
Edit6.Text := IntToStr (MyData[0].tick_volume);
Edit7.Text := IntToStr (MyData[0].spread);
Edit8.Text := IntToStr (MyData[0].real_volume);
end;
"unit2.pas(77,1) Fatal: Internal error 200702251"
Alles was ich da jetzt versuche führt zu Abstürzen, geht soweit das selbst der Debugger abstürzt, die Version die meiner Meinung nach kompilieren müsste tuts aber nicht mit diesem komischen Fehler?
Vielen lieben Dank
