I try to convert in vfp the code from to change paper size from my application but I get the error "5 Access is denied" at GetPrinterA function.
Can anybody help me ?
This is vfp code:
FUNCTION SetMyPrinter
PARAMETERS pPrinterName,dmOrientationPaper,dmFormatPaper
*
LOCAL rezultat,eroare
LOCAL lcPrintDefaults,HandlePrinter,SizeOfPrinterInfo,InfoPrinter
*
DECLARE Integer GetLastError IN kernel32.dll
DECLARE Integer SetLastError IN kernel32.dll
DECLARE Integer FormatMessage IN kernel32.dll ;
Integer dwFlags, String @lpSource, Integer dwMessageId, ;
Integer dwLanguageId, String @lpBuffer, Integer nSize, Integer Arguments
DECLARE Integer OpenPrinter IN WinSpool.Drv ;
String pPrinterName, Integer@ phPrinter, String pDefault
DECLARE Integer ClosePrinter IN WinSpool.Drv ;
Integer hPrinter
DECLARE Integer GetPrinter IN winspool.drv AS GetPrinterA ;
Integer hPrinter, Integer LvL, String @pPrinter, ;
Integer cbBuf, Integer @pcbNeeded
DECLARE Integer SetPrinter IN WinSpool.Drv ;
Integer hPrinter, Integer LvL, ;
Integer pPrinter, Integer Cmd
*
#DEFINE PRINTER_ACCESS_ADMINISTER 4
#DEFINE PRINTER_ALL_ACCESS 0xf000c
#DEFINE PRINTER_INFO 2
#DEFINE ERROR_INSUFFICIENT_BUFFER 122
*
STORE 0 TO HandlePrinter,rezultat,SizeOfPrinterInfo
STORE '' TO eroare,lcPrintDefaults
*
pPrinterName=GETPRINTER()
*
lcPrintDefaults=REPLICATE(CHR(0),8)+CHR(PRINTER_ACCESS_ADMINISTER)+REPLICATE(CHR(0),3)
rezultat=OpenPrinter(pPrinterName,@HandlePrinter,lcPrintDefaults)
IF rezultat=0
eroare=ApiError()
MESSAGEBOX("Cannot open printer "+pPrinterName+CHR(13)+eroare,0+16+0,'ATENTIE !')
RETURN -1
ENDIF
*
* SetLastError(0)
*
InfoPrinter=''
rezultat=GetPrinterA(HandlePrinter,PRINTER_INFO,@InfoPrinter,SizeOfPrinterInfo,@SizeOfPrinterInfo)
IF rezultat=0
eroare=ApiError()
MESSAGEBOX("Cannot get information for printer "+pPrinterName+CHR(13)+eroare,0+16+0,'ATENTIE !')
ClosePrinter(HandlePrinter)
RETURN -1
ENDIF
*
? InfoPrinter
*
ClosePrinter(HandlePrinter)
******
FUNCTION ApiError
LOCAL lcErrBuffer,lcErrorMess,liNewErr,lnErrorCode
lcErrBuffer=REPLICATE(CHR(0),1000)
lnErrorCode=GetLastError()
liNewErr=FormatMessage(0x1000,.NULL.,lnErrorCode,0,@lcErrBuffer,500,0)
lcErrorMess = TRANSFORM(lnErrorCode)+ " " +LEFT(lcErrBuffer,AT(CHR(0),lcErrBuffer)-1)
RETURN lcErrorMess
ENDFUNC
*
ENDFUNC
Can anybody help me ?
This is vfp code:
FUNCTION SetMyPrinter
PARAMETERS pPrinterName,dmOrientationPaper,dmFormatPaper
*
LOCAL rezultat,eroare
LOCAL lcPrintDefaults,HandlePrinter,SizeOfPrinterInfo,InfoPrinter
*
DECLARE Integer GetLastError IN kernel32.dll
DECLARE Integer SetLastError IN kernel32.dll
DECLARE Integer FormatMessage IN kernel32.dll ;
Integer dwFlags, String @lpSource, Integer dwMessageId, ;
Integer dwLanguageId, String @lpBuffer, Integer nSize, Integer Arguments
DECLARE Integer OpenPrinter IN WinSpool.Drv ;
String pPrinterName, Integer@ phPrinter, String pDefault
DECLARE Integer ClosePrinter IN WinSpool.Drv ;
Integer hPrinter
DECLARE Integer GetPrinter IN winspool.drv AS GetPrinterA ;
Integer hPrinter, Integer LvL, String @pPrinter, ;
Integer cbBuf, Integer @pcbNeeded
DECLARE Integer SetPrinter IN WinSpool.Drv ;
Integer hPrinter, Integer LvL, ;
Integer pPrinter, Integer Cmd
*
#DEFINE PRINTER_ACCESS_ADMINISTER 4
#DEFINE PRINTER_ALL_ACCESS 0xf000c
#DEFINE PRINTER_INFO 2
#DEFINE ERROR_INSUFFICIENT_BUFFER 122
*
STORE 0 TO HandlePrinter,rezultat,SizeOfPrinterInfo
STORE '' TO eroare,lcPrintDefaults
*
pPrinterName=GETPRINTER()
*
lcPrintDefaults=REPLICATE(CHR(0),8)+CHR(PRINTER_ACCESS_ADMINISTER)+REPLICATE(CHR(0),3)
rezultat=OpenPrinter(pPrinterName,@HandlePrinter,lcPrintDefaults)
IF rezultat=0
eroare=ApiError()
MESSAGEBOX("Cannot open printer "+pPrinterName+CHR(13)+eroare,0+16+0,'ATENTIE !')
RETURN -1
ENDIF
*
* SetLastError(0)
*
InfoPrinter=''
rezultat=GetPrinterA(HandlePrinter,PRINTER_INFO,@InfoPrinter,SizeOfPrinterInfo,@SizeOfPrinterInfo)
IF rezultat=0
eroare=ApiError()
MESSAGEBOX("Cannot get information for printer "+pPrinterName+CHR(13)+eroare,0+16+0,'ATENTIE !')
ClosePrinter(HandlePrinter)
RETURN -1
ENDIF
*
? InfoPrinter
*
ClosePrinter(HandlePrinter)
******
FUNCTION ApiError
LOCAL lcErrBuffer,lcErrorMess,liNewErr,lnErrorCode
lcErrBuffer=REPLICATE(CHR(0),1000)
lnErrorCode=GetLastError()
liNewErr=FormatMessage(0x1000,.NULL.,lnErrorCode,0,@lcErrBuffer,500,0)
lcErrorMess = TRANSFORM(lnErrorCode)+ " " +LEFT(lcErrBuffer,AT(CHR(0),lcErrBuffer)-1)
RETURN lcErrorMess
ENDFUNC
*
ENDFUNC