/***************************************************************************
Error processing for INI Copier
****************************************************************************/
#define INCL_DOSPROCESS
#define INCL_WINERRORS
#define INCL_DOSSEMAPHORES
#include "global.h"
#include "resource.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* global variables */
/* function prototypes */
/* implementation */
/* mostra una finestra con informazioni sull'eccezione */
/* Come paramtro accetta il puntatore alla struttura ExceptioonReportRecord
che viene passato dal sistema al gestore delle eccezioni */
void ExcptBox(PEXCEPTIONREPORTRECORD pReport)
{
char msg[MSG_MAXSIZE]; /* buffer per il messaggio */
PTIB pTib; /* Thread Information Block */
PPIB pPib; /* Process Information Block */
ULONG param; /* parametro dell'eccezione */
HWND hWnd; /* Finestra padrona */
/* Ottiene le informazioni sul processo */
DosGetInfoBlocks(&pTib,&pPib);
/* Usa come parent la finestra principale se non c'e` usa il Desktop */
if(hMainWindow!=NULLHANDLE)
hWnd=hMainWindow;
else
hWnd=HWND_DESKTOP;
/* Controlla il tipo di eccezione */
switch(pReport->ExceptionNum)
{
/* Violazione di accesso alla memoria */
case XCPT_ACCESS_VIOLATION:
param=pReport->ExceptionInfo[1];
break;
/* Conclusione asincrona del thread */
case XCPT_ASYNC_PROCESS_TERMINATE:
param=pReport->ExceptionInfo[0];
break;
/* non c'e` nessun parametro */
default:
param=0;
break;
}
/* Compone il messaggio e lo mostra in una MessageBox */
sprintf(msg,"Thread: %d\nException Code: %X\nAddress: %X\nParam: %X",
pTib->tib_ptib2->tib2_ultid,
pReport->ExceptionNum,
pReport->ExceptionAddress,
param);
WinMessageBox(hWnd,NULLHANDLE,
msg,"Exception",0,
MB_OK | MB_ERROR | MB_MOVEABLE | MB_APPLMODAL);
/*
exit(pReport->ExceptionNum);
*/
}
/* mostra le informazioni relative ad un errore di PM */
/* Come parametri vuole l'handle dell Anchor Block del thread e un flag
booleano che indichi se terminare il programma */
void PMErrorBox(HAB hab,BOOL fl)
{
ERRORID id; /* codice dell'errore */
PSZ pszFormat; /* Stringa di formattazione */
char msg[MSG_MAXSIZE]; /* buffer messaggio */
/* Ottiene il codice dell'ultimo errore di PM */
id=WinGetLastError(hab);
/* Carica la stringa di formato e compone il messaggio */
pszFormat=LoadString(IDS_PMERRFMT);
sprintf(msg,pszFormat,id);
/* mostra il mex in una MessageBox */
WinMessageBox(HWND_DESKTOP,NULLHANDLE,
msg,"Error",0,
MB_OK | MB_ERROR | MB_MOVEABLE );
/* Libera la memoria e se fl e` TRUE termina il programma */
MemFree(pszFormat);
if(fl)
exit(id);
}
/* Mostra una finestra con un messaggio d'errore identificato da msgid */
void ErrorBox(int msgid,BOOL fl)
{
char msg[MSG_MAXSIZE];
LONG length;
/* Carica il messaggio dalle risorse e se non ci riesce mostra un
messaggio predefinito */
length=WinLoadMessage(habMainThread,NULLHANDLE,msgid,
MSG_MAXSIZE,msg);
if(length==0)
sprintf(msg,"Cannot locate error message: %d",msgid);
/* Mostra la finestra */
WinMessageBox(HWND_DESKTOP,NULLHANDLE,
msg,"Error",msgid,
MB_OK | MB_ERROR | MB_MOVEABLE );
if(fl)
exit(msgid);
}
/* cariuca una stringa identificata da strid dalle risorse */
char *LoadString(int strid)
{
char str[STR_MAXSIZE];
LONG length;
PSZ pszString;
/* carica la stringa e se non la trova mostra un messaggio d'erore */
length=WinLoadString(habMainThread,NULLHANDLE,strid,
STR_MAXSIZE,str);
if(length==0)
ErrorBox(IDE_STRING,TRUE);
/* Copia la stringa e se non c'e` abbastanza memoria mostra un messaggio
d'errore */
pszString=strdup(str);
if(pszString==NULL)
ErrorBox(IDE_MEMORY,TRUE);
return pszString;
}
/* fine di error.c */
Last modified 20-11-96 |