Нарушение на достъпа, когато пусна TidSMTP във формуляр

Имам проблем с Delphi XE4: когато пусна във формуляр TIdSmtp или TIsSSLIOHandlerSocketOpenSSL, получавам тази грешка:

[511EDABF]{IndySystem180.bpl} IdStack.TIdStack.IncUsage (Line 688, "IdStack.pas" + 11) + $7
[511EEBB2]{IndySystem180.bpl} IdComponent.TIdComponent.InitComponent (Line 229, "IdComponent.pas" + 1) + $5
[50EE84A2]{IndyCore180.bpl} IdTCPConnection.TIdTCPConnection.InitComponent (Line 912, "IdTCPConnection.pas" + 1) + $2
[50EE0D99]{IndyCore180.bpl} IdTCPClient.TIdTCPClientCustom.InitComponent (Line 256, "IdTCPClient.pas" + 1) + $2
[50FC53D5]{IndyProtocols180.bpl} IdExplicitTLSClientServerBase.TIdExplicitTLSClient.InitComponent (Line 262, "IdExplicitTLSClientServerBase.pas" + 1) + $2
[50FC8E5D]{IndyProtocols180.bpl} IdMessageClient.TIdMessageClient.InitComponent (Line 643, "IdMessageClient.pas" + 1) + $2
[510B9AF9]{IndyProtocols180.bpl} IdSMTPBase.TIdSMTPBase.InitComponent (Line 193, "IdSMTPBase.pas" + 1) + $2
[510BB47D]{IndyProtocols180.bpl} IdSMTP.TIdSMTP.InitComponent (Line 383, "IdSMTP.pas" + 1) + $2
[511CF547]{IndySystem180.bpl} IdBaseComponent.TIdInitializerComponent.Create (Line 186, "IdBaseComponent.pas" + 4) + $4
[21D64B2B]{delphicoreide180.bpl} CompPalMgr.TComponentPalettePageItemDelegate.CreateComponent (Line 2756, "CompPalMgr.pas" + 2) + $7
[2113FFAB]{designide180.bpl} ComponentDesigner.TComponentRoot.DoCreateComponent (Line 2359, "ComponentDesigner.pas" + 12) + $17
[21145796]{designide180.bpl} ComponentDesigner.TComponentRoot.CreateCurrentComponent (Line 4450, "ComponentDesigner.pas" + 2) + $32
[2115DBAA]{designide180.bpl} Surface.TDesignSurface.CreateItem (Line 195, "Surface.pas" + 1) + $11
[2111193A]{designide180.bpl} Designer.TDesigner.DoDragCreate (Line 794, "Designer.pas" + 1) + $F
[211121E8]{designide180.bpl} Designer.TDesigner.DragEnd (Line 974, "Designer.pas" + 19) + $3
[21114880]{designide180.bpl} Designer.TDesigner.MouseUp (Line 1763, "Designer.pas" + 1) + $2
[51FEEE82]{vcldesigner180.bpl} VCLSurface.MouseEvent (Line 3187, "VCLSurface.pas" + 45) + $11
[5005F7EB]{rtl180.bpl  } System.TMonitor.Exit (Line 16933, "System.pas" + 2) + $7
[51FEFA6F]{vcldesigner180.bpl} VCLSurface.TVclDesignSurface.IsDesignMsg (Line 3448, "VCLSurface.pas" + 48) + $6
[50582B07]{vcl180.bpl  } Vcl.Forms.TApplication.DispatchAction (Line 11494, "Vcl.Forms.pas" + 9) + $C
[0B6A7E30]{IDEFixPack.dll} VCLDesignerGuideLinesHideFix.IsDesignMsg + $94
[5045287F]{vcl180.bpl  } Vcl.Controls.TControl.WndProc (Line 7137, "Vcl.Controls.pas" + 4) + $21
[50170090]{rtl180.bpl  } System.Classes.StdWndProc (Line 16860, "System.Classes.pas" + 8) + $0
[50456DEB]{vcl180.bpl  } Vcl.Controls.TWinControl.IsControlMouseMsg (Line 9807, "Vcl.Controls.pas" + 1) + $9
[504575B5]{vcl180.bpl  } Vcl.Controls.TWinControl.WndProc (Line 10039, "Vcl.Controls.pas" + 153) + $6
[505777F9]{vcl180.bpl  } Vcl.Forms.TCustomForm.WndProc (Line 4388, "Vcl.Forms.pas" + 201) + $5
[51FF84BF]{vcldesigner180.bpl} VCLFormContainer.TControlSizer.ControlWndProc (Line 311, "VCLFormContainer.pas" + 33) + $C
[50456BF8]{vcl180.bpl  } Vcl.Controls.TWinControl.MainWndProc (Line 9751, "Vcl.Controls.pas" + 3) + $6
[50170090]{rtl180.bpl  } System.Classes.StdWndProc (Line 16860, "System.Classes.pas" + 8) + $0
[50582213]{vcl180.bpl  } Vcl.Forms.TApplication.CancelHint (Line 11117, "Vcl.Forms.pas" + 6) + $E
[50580E87]{vcl180.bpl  } Vcl.Forms.TApplication.ProcessMessage (Line 10288, "Vcl.Forms.pas" + 23) + $1
[50580ECA]{vcl180.bpl  } Vcl.Forms.TApplication.HandleMessage (Line 10318, "Vcl.Forms.pas" + 1) + $4
[50581205]{vcl180.bpl  } Vcl.Forms.TApplication.Run (Line 10456, "Vcl.Forms.pas" + 26) + $3

Някой може ли да ми помогне?

С други компоненти като IdUserPassProvider или IdSASLPlain работят добре.

за разбирането


person Daniele Barbato    schedule 22.02.2014    source източник
comment
Това случва ли се, ако създадете ново, празно приложение за VCL формуляри и пуснете компонента върху новия, празен формуляр?   -  person Ken White    schedule 23.02.2014
comment
Това е изключително странен проблем и инстинктите ми ме карат да вярвам, че е възможно да е направена някаква персонализация на библиотеката Indy? Тоест, ако предложеният от Кен тест също се провали. В противен случай, ако ново приложение не причинява проблеми, тогава вината сочи конкретния проект, в който се използва. Или евентуално надграждане/понижаване на Indy, което е било неуспешно?   -  person Jerry Dodge    schedule 23.02.2014
comment
Изглежда като дефект на Инди. Посочването на номера на версията (Delphi и Indy) би било полезно. Надграждането до най-новия Indy може да помогне.   -  person David Heffernan    schedule 23.02.2014
comment
@KenWhite : да, имам същия проблем с нов проект. подозирам, че има някакъв пакет, който съм деактивирал, който причинява тази грешка. Разследвам   -  person Daniele Barbato    schedule 23.02.2014


Отговори (2)


Трудно е да диагностицирате проблема си, без да видите действителното съобщение за грешка. Това действително EAccessViolation изключение ли е или е различен тип изключение? Само защото е повдигнато изключение, не гарантира, че то всъщност е EAccessViolation, освен ако наистина не е нарушение на достъпа.

TIdStack.IncUsage() гарантира, че глобалният GStack обект на Indy съществува. Този обект е това, което осигурява достъп до всички API функции на ниско ниво, специфични за платформата, използвани в Idny. Самият IncUsage() е class метод, така че не се извиква на екземпляр на TIdStack обект, така че самото извикване на IncUsage() не е причина за изключението.

Вътрешно IncUsage() използва три глобални променливи в единицата IdStack:

GStackCriticalSection: TIdCriticalSection
GInstanceCount: LongWord
GStackClass: TIdStackClass

И трите променливи се инициализират до 0/nil в съответните им декларации, а след това GStackClass и GStackCriticalSection се присвояват/конструират в секцията initialization на модула IdStack.

Изключение може да възникне само ако една от тези променливи е невалидна по време на извикването на IncUsage() (освен ако изключението не идва от конструктор TIdStack, но не виждам това във вашия стек за повиквания).

Може би нещо във вашия проект пречи на initialization да бъде извикан, причинявайки IncUsage() да се срине, когато се опита да влезе в ключалката GStackCriticalSection (но не виждам TIdCriticalSection.Enter във вашия стек за повиквания)? Има Assert(), за да се уверите, че GStackCriticalSection не е nil, преди да се използва, но може би вашето копие на Indy е компилирано с деактивирани твърдения?

person Remy Lebeau    schedule 24.02.2014
comment
Пълното съобщение за грешка е: Нарушение на достъпа на адрес 511EDABF в модул „IndySystem180.bpl“. Прочетете адрес 14D04428. - person Daniele Barbato; 26.02.2014
comment
Съобщението за грешка е: Нарушение на достъпа на адрес 512FF2AF в модул „IndySystem210.bpl“. Прочетете адрес 14144508. Изтриването на файла Dproj и оставянето на Delphi да го генерира отново ще реши проблема. - person Z80; 10.02.2017

благодаря за подкрепата, реших проблема, но все още не разбрах защо.

проблемът е в пакета Design; Прилагам разликите между dproj, който работи, и dproj с грешката.

Все още не съм разбрал дали зависи от един пакет или повече, така или иначе, активирането на всички пакети работи правилно.

Благодаря отново, ще се върна, за да репликирам, ако намеря пакета, който генерира грешката.

разлики между работещ и неработещ dproj

person Daniele Barbato    schedule 26.02.2014
comment
Вашето решение работи. Изтрийте стария Dproj файл и оставете Delphi да го създаде отново (което означава, че грешката не е в Indy, а в Delphi). - person Z80; 10.02.2017