当我滴个TidSMTP在窗体上访问冲突(Access Violation when i drop a

2019-10-19 09:41发布

我有一个问题用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其他部件工作正常。

问候

Answer 1:

这是很难不看到实际的错误消息来诊断您的问题。 它是一个实际的EAccessViolation异常,或者是一个不同类型的异常? 仅仅因为一个引发异常并不能保证它实际上是一个EAccessViolation ,除非它确实是一个访问冲突。

TIdStack.IncUsage()确保Indy的全球GStack对象存在。 那对象是什么可以访问所有的整个Idny使用的低级别特定于平台的套接字API函数。 IncUsage()本身是一个class的方法,所以它不叫上TIdStack对象实例,所以仅仅调用IncUsage()本身是没有例外的原因。

在内部, IncUsage()使用的三个全局变量IdStack单位:

GStackCriticalSection: TIdCriticalSection
GInstanceCount: LongWord
GStackClass: TIdStackClass

所有三个变量被初始化为0 / nil在各自的声明,然后GStackClassGStackCriticalSection分配/在构建的initialization的部分IdStack单元。

如果这些变量之一是当时无效只能发生异常IncUsage()被调用(除非异常是从一个即将TIdStack构造函数,但我不明白,在你调用堆栈)。

也许,在一些项目被阻止initialization被调用,造成IncUsage()以当它试图进入崩溃GStackCriticalSection锁(但我没有看到TIdCriticalSection.Enter在调用栈)? 有一个Assert()以确保GStackCriticalSection不是nil它在使用之前,但也许你印的副本编译断言禁用?



Answer 2:

感谢您的支持,我解决了这个问题,但我还没有明白这是为什么。

问题是在设计包装; 我附上工作dproj与错误的dproj之间的差异。

我还没有想通了,如果它依赖于一个单一的包或更多,反正,使所有的包正常工作。

再次感谢,我回去,如果我找到产生错误的包复制。



文章来源: Access Violation when i drop a TidSMTP on a Form