Нарушение прав доступа, когда я бросаю 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() гарантирует, что глобальный объект Indy GStack существует. Именно этот объект обеспечивает доступ ко всем низкоуровневым 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