delphidelphi-xe5

Delphi XE5 Acces Violation on app start


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.


Solution

  • 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.