Team OS/2 Italia - Developer Assistant

------------------------------------------

INI Copier v1.00

Un esempio di programma PM Multi-Threaded

error.c

/***************************************************************************
 
 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 */

---------------------------------------------------

Torna alla nostra HomePage - Pagina a cura di: Giovanni Pagni
Last modified 20-11-96