2014-02-14 63 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

在問你問:*它可能是內存泄漏和內存碎片的原因?*什麼內存泄漏?什麼碎片? –