Code: Select all
#pragma BEGINDUMP
#undef UNICODE
#include <windows.h>
#include "hbapi.h"
#include "hbvm.h"
#include "hbstack.h"
#include "hbapiitm.h"
#define MAX_FILE_NAME 1024
#define BIG_BUFFER (1024*32)
HB_FUNC ( ENUMPRINTERS) {
UCHAR *Result ;
DWORD x, Flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS ;
LPSTR Name = NULL ;
DWORD Level = 5 ;
PRINTER_INFO_5 *pPrinterEnum, *pFree;
PRINTER_INFO_4 *pPrinterEnum4, *pFree4;
DWORD cbBuf ;
DWORD BytesNeeded=0 ;
DWORD NumOfPrinters=0 ;
OSVERSIONINFO osvi ; // altered to check Windows Version
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
Level = 4 ;
EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum4,0,&BytesNeeded,&NumOfPrinters) ;
if (BytesNeeded > 0) {
Result = (UCHAR *) hb_xgrab(BytesNeeded) ;
*Result = '\0' ;
pFree4 = pPrinterEnum4 = (PRINTER_INFO_4 *) hb_xgrab(BytesNeeded) ;
cbBuf = BytesNeeded ;
if (EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum4,cbBuf,&BytesNeeded,&NumOfPrinters)) {
for (x=0 ; x< NumOfPrinters ; x++, pPrinterEnum4++ ) {
strcat(Result,pPrinterEnum4->pPrinterName) ;
strcat(Result,";") ;
}
}
hb_retc(Result) ;
hb_xfree(Result) ;
hb_xfree(pFree4) ;
}
else
hb_retc("") ;
}
else {
EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum,0,&BytesNeeded,&NumOfPrinters) ;
if (BytesNeeded > 0) {
Result = (UCHAR *) hb_xgrab(BytesNeeded) ;
*Result = '\0' ;
pFree = pPrinterEnum = (PRINTER_INFO_5 *) hb_xgrab(BytesNeeded) ;
cbBuf = BytesNeeded ;
if (EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum,cbBuf,&BytesNeeded,&NumOfPrinters)) {
for (x=0 ; x< NumOfPrinters ; x++, pPrinterEnum++ ) {
strcat(Result,pPrinterEnum->pPrinterName) ;
strcat(Result,";") ;
}
}
hb_retc(Result) ;
hb_xfree(Result) ;
hb_xfree(pFree) ;
}
else
hb_retc("") ;
}
}
HB_FUNC( WINDEFAULTPRINTER ) {
DWORD x, y ;
UCHAR lpReturnedString[MAX_FILE_NAME] ;
x
=GetProfileString("windows","device","",lpReturnedString,MAX_FILE_NAME-1);
y = 0 ;
while ( y < x && lpReturnedString[y] != ',' )
y++ ;
hb_retclen(lpReturnedString,y) ;
}
HB_FUNC( PRINTFILERAW ) {
UCHAR printBuffer[BIG_BUFFER], *cPrinterName, *cFileName, *cDocName ;
HANDLE hPrinter, hFile ;
DOC_INFO_1 DocInfo ;
DWORD nRead, nWritten, rVal = -1 ;
if (ISCHAR(1) && ISCHAR(2)) {
cPrinterName= hb_parc(1) ;
cFileName= hb_parc(2) ;
if ( OpenPrinter(cPrinterName, &hPrinter, NULL) != 0 ) {
DocInfo.pDocName = hb_parc(3) ;
DocInfo.pOutputFile = NULL ;
DocInfo.pDatatype = "RAW" ;
if ( StartDocPrinter(hPrinter,1,(char *) &DocInfo) != 0 ) {
if ( StartPagePrinter(hPrinter) != 0 ) {
hFile = CreateFile(cFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) ;
if (hFile != INVALID_HANDLE_VALUE ) {
while (ReadFile(hFile, printBuffer, BIG_BUFFER, &nRead, NULL) && (nRead > 0)) {
if (printBuffer[nRead-1] == 26 )
nRead-- ; // Skip the EOF() character
WritePrinter(hPrinter, printBuffer, nRead, &nWritten) ;
}
rVal = 1 ;
CloseHandle(hFile) ;
}
else
rVal= -6 ;
EndPagePrinter(hPrinter) ; // 28/11/2001 10:16
}
else
rVal = -4 ;
EndDocPrinter(hPrinter);
}
else
rVal= -3 ;
ClosePrinter(hPrinter) ;
}
else
rVal= -2 ;
}
hb_retnl(rVal) ;
}
#pragma ENDDUMP