On two computers is ok, on three there is the same exception with the same addres for AV. Thank for help
begin
Application.Hinthidepause := 30000;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.Run;
end;
exception class : EAccessViolation
exception message : Access violation at address 00405361 in module 'Project1.exe'. Read of address 00000064.
main thread ($1d44):
00405361 +3d Project1.exe System 75 +0 SysGetMem
00406827 +3f Project1.exe System 75 +0 @ReallocMem
0040c38c +d8 Project1.exe System 75 +0 DynArraySetLength
0040c4bd +05 Project1.exe System 75 +0 @DynArraySetLength
005465af +23 Project1.exe System.Classes {System.Generics.Collections}TList<System.Generics.Collections.TList<System.Classes.TComponent>>.SetCapacity
005466b0 +2c Project1.exe System.Classes {System.Generics.Collections}TList<System.Generics.Collections.TList<System.Classes.TComponent>>.Grow
005466d2 +16 Project1.exe System.Classes {System.Generics.Collections}TList<System.Generics.Collections.TList<System.Classes.TComponent>>.GrowCheck
00546a4d +0d Project1.exe System.Classes {System.Generics.Collections}TList<System.Generics.Collections.TList<System.Classes.TComponent>>.Add
0051e75e +36 Project1.exe System.Classes BeginGlobalLoading
0051e8de +46 Project1.exe System.Classes InitInheritedComponent
0064cfde +c6 Project1.exe Vcl.Forms TCustomForm.Create
00657ffa +76 Project1.exe Vcl.Forms TApplication.CreateForm
00883ce7 +c7 Project1.exe Project1 54 +13 initialization
76a13368 +10 kernel32.dll
UPDATE Problem was with this procedure:
procedure KopiujRTF(const Source, destination: TRichEdit);
var
rtfStream: TEditStream;
sourceStream: TMemoryStream;
function EditStreamReader(dwCookie: DWORD; pBuff: Pointer; cb: LongInt;
pcb: PLongInt): DWORD; stdcall;
begin
Result := $0000;
try
pcb^ := TStream(dwCookie).Read(pBuff^, cb);
except
Result := $FFFF;
end;
end;
begin
destination.Lines.BeginUpdate;
sourceStream := TMemoryStream.Create;
try
Source.Lines.SaveToStream(sourceStream);
sourceStream.Position := 0;
destination.MaxLength := destination.MaxLength + sourceStream.Size;
rtfStream.dwCookie := DWORD(sourceStream);
rtfStream.dwError := $0000;
rtfStream.pfnCallback := @EditStreamReader;
destination.Perform(EM_STREAMIN, SFF_SELECTION or SF_RTF or SFF_PLAINRTF,
lParam(@rtfStream));
if rtfStream.dwError <> $0000 then
zolty := True;
sourceStream.Free;
destination.Lines.EndUpdate;
except
end;
end;
On form1 create i had:
RichEdit1.MaxLength := $7FFFFFF0;
after enabling Range check debugger highlited this:
destination.MaxLength := destination.MaxLength + sourceStream.Size;
Removing max length for RichEdit resolved problem. Thanks for Yours help.
The call stack indicates that you have corrupted the heap in some other part of your program. That's the explanation, with probability > 0.999, for an access violation in SysGetMem
.
You'll need to look at what happens during startup, before the code in this call stack is executed. Look for buffer overruns, that is accessing out-of-bounds array elements. It is very likely that merely enabling the indispensible range checking feature will be enough to locate your program's defect.