2014-02-14 64 views
0

基于COM技术的项目。 我已经在德尔福XE4 64位记录由JCL错误(SKGeneral64是COM DLL):德尔福XE4 64位_TExitDllException

ERR (ThreadID=14C8 14.02.2014 16:43:14:274) - Exception class: _TExitDllException 
Exception address: 000000000536DBAE 
Stack list, generated 14.02.2014 16:43:14 
[000000000536DBAE] System.ExitDll + $3E 
[000000000536DCF4] [email protected] + $54 
[000000000536D5E3] [email protected] + $123 
[0000000005375FA2] [email protected] + $92 
[00000000056D7938] SKGeneral64.SKGeneral64 + $38 
[000000007777C76C] Unknown function at RtlUserThreadStart + $26C 
[000000007777C42F] Unknown function at LdrInitializeThunk + $10F 
[000000007777C32E] LdrInitializeThunk + $E 
---------------------------------------------------------------------------------------------------- 
System : Windows 7 Professional, Version: 6.1, Build: 1DB1, "Service Pack 1" 
Processor: Intel, Intel(R) Xeon(R) CPU   X5670 @ 2.93GHz, 2960 MHz MMX 
---------------------------------------------------------------------------------------------------- 
Module: C:\PROGRA~2\SKBKON~1\Active\Bin\SKGENE~2.DLL Modified: 14.02.2014 16:42:37 
Version: 1.0.0.0 Description: 

什么它的原因是什么?它可能是内存泄漏和内存碎片的原因吗?

+0

很难说没有看到代码? – whosrdaddy

+0

@whosrdaddy生病做后面的例子,并会写你的评论 – Sibay

回答

2

经过一番探索,似乎预料到这种异常,并且是线程终止时线程返回其退出代码的方式。

这是怎么回事。一个调用,以System.ExitDll它做到这一点:

procedure ExitDll(Context: PInitContext); 
var 
    ResultExitCode: Integer; 
begin 
    Context^ := Context.OuterContext^; 
    ResultExitCode := ExitCode; 
    ExitCode := 0; 
    //raise _TExitDllException.Create(ResultExitCode); 
    _RaiseExcept(_TExitDllException.Create(ResultExitCode)); 
end; 

这就是引发异常。唯一的例外是在_HandleExitDllException处理:

function _HandleExitDllException: Integer; 
var 
    ExceptionObject: TObject; 
begin 
    Result := -1; 
    ExceptionObject := ExceptObject; 
    if ExceptionObject is _TExitDllException then 
    Result := _TExitDllException(ExceptionObject).ExitCode 
    else 
    _UnhandledException; 
    _DoneExcept; 
end; 

此代码读取异常退出码和值返回给调用者。在RTL中看不到任何调用_HandleExitDllException的代码,这大概是因为编译器/链接器神奇地链接了它。

本质上这是您的错误报告软件的误报。这个异常是正常程序执行的一部分。没有什么可担心的。除了你的错误报告代码,这似乎有缺陷。

+0

它可以像这样的内存泄漏? [链接](http://stackoverflow.com/questions/10548888/memory-leak-in-the-win64-delphi-rtl-during-thread-shutdown) – Sibay

+0

你为什么认为这是一个泄漏?我的猜测是你的错误报告软件不足。我是madexcept的粉丝。 –

+0

在问你问:*它可能是内存泄漏和内存碎片的原因?*什么内存泄漏?什么碎片? –