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