Team OS/2 Italia - Developer Assistant

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

INI Copier v1.00

Un esempio di programma PM Multi-Threaded

global.h

/***************************************************************************
 
 Global include file for INI Copier
 
 ****************************************************************************/

#define INCL_DOSEXCEPTIONS
#define INCL_WINWINDOWMGR
#define INCL_WINSHELLDATA

#include <os2.h>


/* queste macro servono per garantire la compilazione con gli stessi effetti
sia con il Watcom che con il VisualAge */
#if (defined(__IBMC__) || defined (__IBMCPP__))
#define THREADFN     _LNK_CONV
typedef void (* _LNK_CONV PTHREADFN)(void *);
#define LINKAGE
#endif

#ifdef __WATCOMC__
#define THREADFN
typedef void (* PTHREADFN)(void *);
#undef EXPENTRY
#define EXPENTRY __export __syscall
#ifdef __cplusplus
	#define LINKAGE extern "C"
#else
	#define LINKAGE
#endif
#endif

/* macro definitions */

/* Messaggi di comunicazione tra threads */
#define WM_FILENAME         WM_USER+100
#define WM_PROFILE          WM_USER+102
#define WM_PROFILECLOSED    WM_USER+103

/* Costanti per identificare il profilo a cui si riferisce un messaggio */
#define PROFILE_A           1
#define PROFILE_B           2
/* Erroe in un thread */
#define FAILURE             3

/* dimensione dello stack per ciascun thread */
#define THREAD_STACK        0x2000

/* types definitions */

/* Questa struttura costituisce l'header dei blocchi di memoria in cui 
   vengono immagazzinati i nomi delle sezioni, tiene il conto dei nomi
   presenti in modo da sapere quando si puo` liberare il blocco */
typedef struct _blockinfo
{
    int         Count;
} BlockInfo;

/* dati che vengono passati ai thread */
typedef struct _threaddata
{
    HWND        hWnd;          /* Handle della finestra principale */
    ULONG       ListId;        /* ID della lista delle application */
    ULONG       SubListId;     /* ID della sottolista */
    int         Profile;       /* numero identificativo del profilo */
    PSZ         fName;         /* File name */
} ThreadData;

/* Struttura per memorizzare un elemento della sottolista */
typedef struct _prfsubitem
{
    PSZ                 Name;       /* Indirizzo Nome */
    BlockInfo           *Block;     /* Indirizzo dell'inizio del blocco */
    struct _prfsubitem  *Next;      /* Indirizzo nome succesivo */
} PrfSubItem;

/* Struttura per memorizzare un elemento della lista delle applicazioni */
typedef struct _prfitem
{
    PSZ         		Name;       /* Indirizzo Nome dell'applicazione */
    BlockInfo           *Block;     /* Indirizzo dell'inizio del blocco */
    PrfSubItem          *SubList;   /* Indirizzo d'inizio della sottolista */
    struct _prfitem     *Next;      /* Indirizzo nome successivo */
} PrfItem;

/* Struttura passata quando e` stato aperto un nuovo profilo */
typedef struct _prfopen
{
    HWND                hWnd;       /* Handle della finestra principale */
    int                 Profile;    /* numero identificativo del profilo */
    PrfItem             *List;      /* Inizio della lista linkata */
} PrfOpen;

/* Struttura che contiene i dati relativi a ciascun profilo */
typedef struct _profileinfo
{
    enum _status
    {
        closed, closing, opening, opened
    }           		Status;         /* stato attuale del profilo */
    HINI            	hProfile;       /* handle del profilo aperto */
    PSZ                 FileName;       /* nome del file di profilo */
    ThreadData          *pthData;       /* Indirizzo dati passati al thread */
    PrfItem             *List;          /* inizio lista linkata */
} ProfileInfo;

/* global variables */

extern HAB      habMainThread;  /* Handle dell HAb del Thread */
extern HWND     hMainWindow;    /* Handle finestra principale */

/* functions prototypes */

/* Funzioni di gestione della memoria da main.c */
void *Memory(int size);       /* alloca la memoria */
void MemFree(void * pv);      /* libera la memoria */

/* Funzioni di gestione degli errori da Error.c */
void ErrorBox(int msgid,BOOL fl);       /* mostra il messaggi dalle risorse */

void PMErrorBox(HAB hab,BOOL fl);       /* mostra l'errore riportato da PM */

void ExcptBox(PEXCEPTIONREPORTRECORD pReport);

char *LoadString(int strid);    /* legge una stringa dalle risorse */


/* Funzioni della finestra principale da MainWnd.c */

LINKAGE MRESULT EXPENTRY MainWndProc(HWND hWnd,
                                     ULONG msg,
                             	     MPARAM mParam1,
                             	     MPARAM mParam2);
LINKAGE MRESULT EXPENTRY SubFrameProc(HWND hWnd,
                                      ULONG msg,
                               	      MPARAM mParam1,
                              	      MPARAM mParam2);

/* Funzione dell'About Box da about.c */

LINKAGE MRESULT EXPENTRY AboutWndProc(HWND hWnd,
                                      ULONG msg,
                              	      MPARAM mParam1,
                              	      MPARAM mParam2);

/* Funzioni principali dei thread di apertura e chiusura del profilo 
   da threads.c */

VOID THREADFN OpenThread(ThreadData *data);
VOID THREADFN CloseThread(PrfOpen *data);

/* Funzioni per gestire le liste da list.c */

PrfItem *BuildLists(HINI hPrf); /* Costruisce la lista di un profilo */

BOOL ClearLists(PrfItem *Item); /* cancella una lista */

/* FillLists riempie la lista delle applicazioni e quella delle 
   sottosezioni */
void FillLists(HWND hList,HWND hSubList, PrfItem *Item);

/* FindItem trova un'applicazione nella lista */
PrfItem *FindItem(PrfItem *Head, PSZ Name);  

/* FindSubItem trova una sottosezione */
PrfSubItem *FindSubItem(PrfSubItem *Head, PSZ Name);

/* FillSubList aggiorna la lista delle sottosezioni */
void FillSubList(HWND hSubList, PrfSubItem *Head);

/* DeleteItem cancella un'applicazione */
PrfItem *DeleteItem(PrfItem *Head, PSZ Name,HWND hList);

/* DeleteSubItem cancella un sottosezione */
PrfSubItem *DeleteSubItem(PrfSubItem *Head,PSZ Name,HWND hSubList);

/* AddItem aggiunge un'applicazione */
PrfItem *AddItem(PrfItem *Head, PSZ Name, HWND hList);

/* AddSubItem aggiunge una sottosezione */
PrfSubItem *AddSubItem(PrfSubItem *Head, PSZ Name);


/* fine di global.h */

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

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