// On Windows platform converts exception to external error info. Exception // object passed as an argument is deleted before return. Returns // error code, which should be returned by a calling procedure. // On Unix platform the function simply re-throws exception. HRESULT ConvertExceptionToComError(Exception* e, const char* source) { #ifdef CFG_WIN32 //int errCode = e->ErrCode(); int errCode = EXTERNAL_ERROR; std::string msg = ExceptionString(e); #ifdef _DEBUG if (!IsEmpty(source)) msg += FormattedString("\nSource: %s", source); #endif // DEBUG CreateComErrorInfo(msg.c_str(), source, NULL, 0); delete e; return errCode; #endif // CFG_WIN32 #ifdef API_POSIX throw e; #endif // API_POSIX }
//--------------------------------------------------------------------------- TTreeNode* __fastcall TExceptionMessages::AddFFL( AnsiString Str, AnsiString File, AnsiString Func, int Line) { MainForm->StatBar->Panels->Items[2]->Text = "E"; if (!OutTree) { AnsiString Mess = "[" + DateTimeToStr(Now()) + "] : " + Str + "\nFile = " + ExtractFileName(File) + " (" + IntToStr(Line) + ")" + "\nFunction = " + Func; ShowMessage(Mess); return NULL; } TTreeNode *TN = OutTree->Items->Add( NULL, "[" + DateTimeToStr(Now()) + "] : " + Str); OutTree->Items->AddChild( TN, AnsiString("File = ") + ExtractFileName(File) + " (" + IntToStr(Line) + ")"); OutTree->Items->AddChild( TN, "Function = " + Func); if (exxp) { OutTree->Items->AddChild( TN, ExceptionString(er.ExceptionCode)); TTreeNode *tn1 = OutTree->Items->AddChild( TN, "Context"); OutTree->Items->AddChild( tn1, "Flags = 0x" + IntToHex((int)cntxt.ContextFlags,8) + ", " + ContextFlagsString(cntxt.ContextFlags)); if ((cntxt.ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) { TTreeNode *tn2 = OutTree->Items->AddChild( tn1, "Control"); OutTree->Items->AddChild( tn2, "Ebp = 0x" + IntToHex((int)cntxt.Ebp,8)); OutTree->Items->AddChild( tn2, "Eip = 0x" + IntToHex((int)cntxt.Eip,8)); OutTree->Items->AddChild( tn2, "SegCs = 0x" + IntToHex((int)cntxt.SegCs,8)); OutTree->Items->AddChild( tn2, "EFlags = 0x" + IntToHex((int)cntxt.EFlags,8)); OutTree->Items->AddChild( tn2, "Esp = 0x" + IntToHex((int)cntxt.Esp,8)); OutTree->Items->AddChild( tn2, "SegSs = 0x" + IntToHex((int)cntxt.SegSs,8)); } if ((cntxt.ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) { TTreeNode *tn2 = OutTree->Items->AddChild( tn1, "Integer"); OutTree->Items->AddChild( tn2, "Edi = 0x" + IntToHex((int)cntxt.Edi,8)); OutTree->Items->AddChild( tn2, "Esi = 0x" + IntToHex((int)cntxt.Esi,8)); OutTree->Items->AddChild( tn2, "Ebx = 0x" + IntToHex((int)cntxt.Ebx,8)); OutTree->Items->AddChild( tn2, "Edx = 0x" + IntToHex((int)cntxt.Edx,8)); OutTree->Items->AddChild( tn2, "Ecx = 0x" + IntToHex((int)cntxt.Ecx,8)); OutTree->Items->AddChild( tn2, "Eax = 0x" + IntToHex((int)cntxt.Eax,8)); } if ((cntxt.ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) { TTreeNode *tn2 = OutTree->Items->AddChild( tn1, "Segments"); OutTree->Items->AddChild( tn2, "SegGs = 0x" + IntToHex((int)cntxt.SegGs,8)); OutTree->Items->AddChild( tn2, "SegFs = 0x" + IntToHex((int)cntxt.SegFs,8)); OutTree->Items->AddChild( tn2, "SegEs = 0x" + IntToHex((int)cntxt.SegEs,8)); OutTree->Items->AddChild( tn2, "SegDs = 0x" + IntToHex((int)cntxt.SegDs,8)); } if ((cntxt.ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT) { TTreeNode *tn2 = OutTree->Items->AddChild( tn1, "Floating point"); OutTree->Items->AddChild( tn2, "Control word = 0x" + IntToHex((int)cntxt.FloatSave.ControlWord,8)); OutTree->Items->AddChild( tn2, "Status word = 0x" + IntToHex((int)cntxt.FloatSave.StatusWord,8)); OutTree->Items->AddChild( tn2, "Tag word = 0x" + IntToHex((int)cntxt.FloatSave.TagWord,8)); OutTree->Items->AddChild( tn2, "Error offset = 0x" + IntToHex((int)cntxt.FloatSave.ErrorOffset,8)); OutTree->Items->AddChild( tn2, "Error selector = 0x" + IntToHex((int)cntxt.FloatSave.ErrorSelector,8)); OutTree->Items->AddChild( tn2, "Data offset = 0x" + IntToHex((int)cntxt.FloatSave.DataOffset,8)); OutTree->Items->AddChild( tn2, "Data selector = 0x" + IntToHex((int)cntxt.FloatSave.DataSelector,8)); OutTree->Items->AddChild( tn2, "Cr0NpxState = 0x" + IntToHex((int)cntxt.FloatSave.Cr0NpxState,8)); } if ((cntxt.ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) { TTreeNode *tn2 = OutTree->Items->AddChild( tn1, "Debug registers"); OutTree->Items->AddChild( tn2, "Dr0 = 0x" + IntToHex((int)cntxt.Dr0,8)); OutTree->Items->AddChild( tn2, "Dr1 = 0x" + IntToHex((int)cntxt.Dr1,8)); OutTree->Items->AddChild( tn2, "Dr2 = 0x" + IntToHex((int)cntxt.Dr2,8)); OutTree->Items->AddChild( tn2, "Dr3 = 0x" + IntToHex((int)cntxt.Dr3,8)); OutTree->Items->AddChild( tn2, "Dr6 = 0x" + IntToHex((int)cntxt.Dr6,8)); OutTree->Items->AddChild( tn2, "Dr7 = 0x" + IntToHex((int)cntxt.Dr7,8)); } if ((cntxt.ContextFlags & CONTEXT_EXTENDED_REGISTERS) == CONTEXT_EXTENDED_REGISTERS) { OutTree->Items->AddChild( tn1, "Extended registers"); } exxp = NULL; } return TN; }