314 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#define STRICT
 | 
						|
#ifndef _INC_WINDOWS
 | 
						|
#include <windows.h>
 | 
						|
#endif
 | 
						|
#include <string.h>
 | 
						|
#include <stdio.h>
 | 
						|
#pragma hdrstop
 | 
						|
 | 
						|
#include "spool.h"
 | 
						|
 | 
						|
HDC 	 	HDCPrinter;		/* Handle Device Context della Stampante */
 | 
						|
int 		PrintOpen;		/* TRUE Stampa in esecuzione, altrimente FALSE */
 | 
						|
DOCINFO 	DocInfo;		/* Struttura per apertura lavoro con la stampante */
 | 
						|
char 		SpoolName[32];	/* Nome dello Spool */
 | 
						|
HINSTANCE	hInst;
 | 
						|
 | 
						|
int FAR PASCAL 	PRCLOSE(void);				/* Chiusura della Stampa */
 | 
						|
int FAR PASCAL 	PROPEN(char far *NameSpool);/* Apertura della Stampa */
 | 
						|
int FAR PASCAL 	PROUT(char far *Buffer);	/* Stampa una Stringa */
 | 
						|
int FAR PASCAL 	PRENDPAGE(void);			/* Chiusura pagina */
 | 
						|
int FAR PASCAL 	PRSTARTPAGE(void);			/* Apertura pagina */
 | 
						|
HDC FAR GetHDCPrintDefault(void);			/* Ritorna HDC della stampante di default */
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	LibMain
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Entrata DLL 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
	HINSTANCE	hInstance
 | 
						|
	WORD 		wDataSegment	
 | 
						|
	WORD 		wHeapSize
 | 
						|
    LPSTR		lpszCmdLine
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
 | 
						|
												WORD wHeapSize, LPSTR lpszCmdLine )
 | 
						|
{
 | 
						|
	if ( wHeapSize != 0 ) UnlockData( 0 );
 | 
						|
 | 
						|
	hInst = hInstance;
 | 
						|
	HDCPrinter	= NULL;
 | 
						|
	PrintOpen	= TRUE;
 | 
						|
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	WEP
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Uscita DLL 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
	int			bSystemExit
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export WEP ( int bSystemExit )
 | 
						|
{
 | 
						|
	PRCLOSE();
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	WEP
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Uscita DLL 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
	int			bSystemExit
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export PRCLOSE()
 | 
						|
{
 | 
						|
	if (PrintOpen == TRUE) EndDoc(HDCPrinter);
 | 
						|
 | 
						|
	PrintOpen		= FALSE;
 | 
						|
 | 
						|
	if (HDCPrinter != NULL) {
 | 
						|
		HDCPrinter	= 0;
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
* 	Funzione 	PROPEN
 | 
						|
*
 | 
						|
*	Descrizione
 | 
						|
*	-----------
 | 
						|
*	Apre un lavoro con la stampante di default di Windows 					
 | 
						|
*
 | 
						|
*	Parametri
 | 
						|
*   ----------
 | 
						|
*	char _FAR		*NameSpool		Descrizione file di Spool 	
 | 
						|
*
 | 
						|
*   Tipo dato ritorno
 | 
						|
*   -----------------
 | 
						|
*   int			0	OK
 | 
						|
*				1	Errore : HDC del device non valido     	
 | 
						|
*				2	Errore : apertura lavoro non valido    
 | 
						|
*
 | 
						|
*	Note
 | 
						|
*	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export PROPEN (char far * NameSpool)
 | 
						|
{
 | 
						|
	PRCLOSE();								/* Chiude eventuale lavoro aperto */
 | 
						|
 | 
						|
	/* Preleva HDC della stampante di default*/ 
 | 
						|
	HDCPrinter	= GetHDCPrintDefault();
 | 
						|
 | 
						|
	if (HDCPrinter != NULL) {
 | 
						|
 | 
						|
    	/* Prepara struttura DOCINFO */
 | 
						|
		DocInfo.cbSize		= sizeof(DocInfo);
 | 
						|
		DocInfo.lpszDocName	= (char far *) SpoolName;
 | 
						|
		DocInfo.lpszOutput	= NULL;
 | 
						|
 | 
						|
        /* Controllo che il nome dello Spool sia inferiore a 32 Byte */
 | 
						|
		if (strlen(NameSpool) > 31) {
 | 
						|
			strncpy(SpoolName, NameSpool, 31);
 | 
						|
			SpoolName[31] = NULL;
 | 
						|
		} else strcpy(SpoolName, NameSpool);
 | 
						|
 | 
						|
        /* Apre il Job */
 | 
						|
		if (StartDoc(HDCPrinter, (DOCINFO far *) &DocInfo) >= 0) {
 | 
						|
			PrintOpen	= TRUE;
 | 
						|
			return 0;	/* OK */
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			PRCLOSE();
 | 
						|
			return 2;	/* Si e' verificato un errore nell' aprire il Job */
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 1;	/* HDC di Default non valido */
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	PROUT
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Stampa il contenuto puntato da Buffer 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
	char _FAR 	*Buffer		Ptr al Buffer contenente l' output per la stampante
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int			0	OK
 | 
						|
    			1	Nessun lavoro aperto
 | 
						|
                2	Errore : Escape non andato a buon fine
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
	Il contenuto del Buffer deve terminare con NULL. 
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export PROUT(char far *Buffer)
 | 
						|
{
 | 
						|
	int 		RetVal;			/* valore di ritorno */
 | 
						|
	char NEAR  *AllocBuffer;	/* Ptr al Buffer */
 | 
						|
	HLOCAL 		HMemLocal;		/* Handle al blocco di memoria allocata localmente */ 
 | 
						|
	size_t		TotLenBuffer;	/* Lunghezza totale del Buffer di Input */
 | 
						|
 | 
						|
    /* Controlla ovviamente che ci sia un lavoro aperto */ 
 | 
						|
	if (PrintOpen == TRUE) {
 | 
						|
 | 
						|
		TotLenBuffer	= _fstrlen(Buffer);
 | 
						|
 | 
						|
		HMemLocal = LocalAlloc(LPTR, TotLenBuffer + 2);	/* Alloca memoria */
 | 
						|
		AllocBuffer	= LocalLock(HMemLocal);				/* Lock dell' Handle */
 | 
						|
 | 
						|
        /* Copia Buffer in AllocBuffer in offset 2 e riempe i primi due byte con lunghezza DOCINFO */
 | 
						|
		_fmemcpy((void far *) (AllocBuffer + 2), Buffer, TotLenBuffer);
 | 
						|
		*(size_t *) AllocBuffer = TotLenBuffer;	
 | 
						|
 | 
						|
        /* Spedisce direttamente il buffer alla stampante */
 | 
						|
		RetVal	= Escape(HDCPrinter, PASSTHROUGH, NULL, (LPCSTR) AllocBuffer, NULL);
 | 
						|
 | 
						|
		LocalUnlock(HMemLocal);	/* UNLock dell' Handle */
 | 
						|
		LocalFree(HMemLocal);	/* Libera memoria */ 
 | 
						|
 | 
						|
		return  RetVal > 0 ? 0 : 2;		/* Ritorna 0 se Escape e' andato a buon fine, altrimenti 1 */  
 | 
						|
	}
 | 
						|
	return 1;	/* Ritorna 1, in quanto non e' aperto nessun lavoro */  
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	PRENDPAGE
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Chiude una pagina 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int			0	OK
 | 
						|
    			1	Nessun lavoro aperto
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export PRENDPAGE()
 | 
						|
{
 | 
						|
	/* Esegue EndPage se un lavoro e' attualmente in esecuzione */
 | 
						|
	if (PrintOpen == TRUE) return EndPage(HDCPrinter) > 0 ? 0 : 1;
 | 
						|
 | 
						|
	return 1;	/* Nessun lavoro aperto */
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	PRSTARTPAGE
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Apre una pagina 					
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    int			0	OK
 | 
						|
    			1	Nessun lavoro aperto
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
int FAR PASCAL _export PRSTARTPAGE()
 | 
						|
{
 | 
						|
	/* Esegue EndPage se un lavoro e' attualmente in esecuzione */
 | 
						|
	if (PrintOpen == TRUE) return (StartPage(HDCPrinter) > 0 ? 0 : 1);
 | 
						|
 | 
						|
	return 1;	/* Nessun lavoro aperto */
 | 
						|
}
 | 
						|
 | 
						|
/*-----------------------------------------------------------------
 | 
						|
 	Funzione 	GetHDCPrintDefault
 | 
						|
 | 
						|
	Descrizione
 | 
						|
	-----------
 | 
						|
	Preleva da Win.Ini nella Sezione [windows] entry [device] la
 | 
						|
    stampante di Default, crea un Device Context ad essa e ritorna
 | 
						|
	il suo Handle.
 | 
						|
 | 
						|
	Parametri
 | 
						|
    ----------
 | 
						|
 | 
						|
    Tipo dato ritorno
 | 
						|
    -----------------
 | 
						|
    HDC			Handle alla stampante (se NULL : errore creazione DC)
 | 
						|
 | 
						|
	Note
 | 
						|
	----
 | 
						|
------------------------------------------------------------------*/
 | 
						|
HDC far GetHDCPrintDefault()
 | 
						|
{
 | 
						|
 | 
						|
	char ProfileDevice[100];
 | 
						|
	char far *Device, far *Driver, far *PortOut;
 | 
						|
 | 
						|
    /* Preleva in Win.Ini la Sezione [windows] entry [device] per	*/
 | 
						|
	/* stampante di default											*/  
 | 
						|
	GetProfileString("windows", "device", "", ProfileDevice, 100);
 | 
						|
 | 
						|
    /* Compone le stringhe per identificare il device e creare il DC */ 
 | 
						|
	if ((Device = strtok(ProfileDevice, ",")) != NULL &&
 | 
						|
			(Driver = strtok(NULL, ", ")) != NULL &&
 | 
						|
			(PortOut = strtok(NULL, ", ")) != NULL) {
 | 
						|
 | 
						|
#if 0
 | 
						|
		return CreateDC(Driver, Device, PortOut, NULL);
 | 
						|
#else
 | 
						|
		return CreateDC("RAW", NULL, PortOut, NULL);
 | 
						|
#endif
 | 
						|
    }
 | 
						|
 | 
						|
    /* DC non creato, ritorna NULL */ 
 | 
						|
	return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/* EOF */
 |