Newsgroup: it.comp.lang.visual-basic
Titolo: problemone URGENTE con GetPrinter

avrei bisogno di un aiuto sull'uso di GetPrinter
la prima chiamata alla funzione serve a sapere quanto spazio č necessario
alla struttura printer-info-2
una volta saputo, riempio una variabile array di long, cosě:
dim buffer() as long
getprinter (lhprinter,2,vbnull,0,needed)
redim buffer(needed/4)
getprinter (lhprinter,2,buffer(0),needed,needed)
in pratica ora in buffer mi trovo l'intera struttura printer-info-2, č cosě
?
la mia domanda č.
a questo punto, come faccio ad estrarre da tale buffer il valore Status (che
č quello che mi interessa) ?
grazie
MarioH


dimenticavo: dove posso trovare i valori delle costanti PRINTER_STATUS
dell'elemento Status della struttura-tipo PRINTER_INFO_2 ?
MarioH

 
-- 
Samuele Battarra
mail server: 
libero.it
, indirizzo: battarsa@(mail server)
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/leggiminews.html

MarioH ha scritto:

Public Const PRINTER_STATUS_BUSY = &H200
Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
Public Const PRINTER_STATUS_ERROR = &H2
Public Const PRINTER_STATUS_INITIALIZING = &H8000
Public Const PRINTER_STATUS_IO_ACTIVE = &H100
Public Const PRINTER_STATUS_MANUAL_FEED = &H20
Public Const PRINTER_STATUS_NO_TONER = &H40000
Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
Public Const PRINTER_STATUS_OFFLINE = &H80
Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
Public Const PRINTER_STATUS_PAPER_JAM = &H8
Public Const PRINTER_STATUS_PAPER_OUT = &H10
Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
Public Const PRINTER_STATUS_PAUSED = &H1
Public Const PRINTER_STATUS_PENDING_DELETION = &H4
Public Const PRINTER_STATUS_PRINTING = &H400
Public Const PRINTER_STATUS_PROCESSING = &H4000
Public Const PRINTER_STATUS_TONER_LOW = &H20000
Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
Public Const PRINTER_STATUS_WAITING = &H2000
Public Const PRINTER_STATUS_WARMING_UP = &H10000
Public Const PRINTER_WRITE = (STANDARD_RIGHTS_WRITE Or PRINTER_ACCESS_USE)
Comunque tutte queste dichiarazioni, compresa quella di tipo del messaggio
precedente, sono nel visualizzatore API.



nel mio non ci sono... avrò un visualizzatore di serie B ?? ::))))
MarioH


gia provato. fa un crash pauroso. devo riavviare il computer manualmente,
perche si blocca tutto....
cmq ora riprovo, vedo di cambiare un po di sintassi...
l'idea di mettere tutto in un buffer l'ho trovata su un vecchissimo
messaggio.
in pratica in quel messaggio si dice che una volta messo tutto nel buffer,
al posto 7 dell'array c'è l'elemento devmode di printer_info_2. c'è una
procedura con copymemory per recuperare l'intera struttura devmode, da
buffer() in una variabile "dimmata" come devmode.
ora mi chiedo: perche devmode sta proprio al punto 7 di buffer?
l'esempio cmq funzionava, solo che non riguardava affatto l'elemento Status,
e quindi mi sono bloccato...
ciao
MarioH

 ciao
La struttura PRINTER_INFO_2 versione originale, cioe' per il C e'
typedef struct _PRINTER_INFO_2 { // pri2
   LPTSTR pServerName;
   LPTSTR pPrinterName;
   LPTSTR pShareName;
   LPTSTR pPortName;
   LPTSTR pDriverName;
   LPTSTR pComment;
   LPTSTR pLocation;
   LPDEVMODE pDevMode;
   LPTSTR pSepFile;
   LPTSTR pPrintProcessor;
   LPTSTR pDatatype;
   LPTSTR pParameters;
   PSECURITY_DESCRIPTOR pSecurityDescriptor;
   DWORD Attributes;
   DWORD Priority;
   DWORD DefaultPriority;
   DWORD StartTime;
   DWORD UntilTime;
   DWORD Status;
   DWORD cJobs;
   DWORD AveragePPM;
} PRINTER_INFO_2; 
In questa struttura sono tutti puntatori (4 byte) e DWORD (4 byte).
Visto che in VB un Long sono 4 byte, puoi definire il buffer come
Dim buffer() As Long
Cosi' l'elemento 0 sara' ServerName, l'elemento 7 devmode,
l'elemento 18 Status.


 --
è quello che avevo pensato anche io... ma non ne vuole proprio sapere di
funzionare (con buffer).
ora riprovo... magari anche con debug.assert.
se per caso ti dovesse capitare il miracolo di trovarti sottomano il codice
preciso e funzionante, fammi un dischio, ok?? ::))))
grazie di tutto
MarioH


(dischio = fischio...)

 
Fiuuuuuuu!!!!
Metti questo codice in un modulo
<CODE>
Option Explicit
Public Const PRINTER_STATUS_PAUSED = &H1
Public Const PRINTER_STATUS_ERROR = &H2
Public Const PRINTER_STATUS_PENDING_DELETION = &H4
Public Const PRINTER_STATUS_PAPER_JAM = &H8
Public Const PRINTER_STATUS_PAPER_OUT = &H10
Public Const PRINTER_STATUS_MANUAL_FEED = &H20
Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
Public Const PRINTER_STATUS_OFFLINE = &H80
Public Const PRINTER_STATUS_IO_ACTIVE = &H100
Public Const PRINTER_STATUS_BUSY = &H200
Public Const PRINTER_STATUS_PRINTING = &H400
Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
Public Const PRINTER_STATUS_WAITING = &H2000
Public Const PRINTER_STATUS_PROCESSING = &H4000
Public Const PRINTER_STATUS_INITIALIZING = &H8000
Public Const PRINTER_STATUS_WARMING_UP = &H10000
Public Const PRINTER_STATUS_TONER_LOW = &H20000
Public Const PRINTER_STATUS_NO_TONER = &H40000
Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
Private Function StatoStampante(ByVal NomeStampante As String) As Long
 
   Dim hPrinter As Long 'Handle della stampante
   Dim Buffer() As Long
   Dim Needed As Long
 
   'Otteniamo l'handle della stampante
   OpenPrinter NomeStampante, hPrinter, 0
   'Non siamo riusciti ad aprire la stampante, forse il nome era sbagliato
   If hPrinter = 0 Then Err.Raise 1000 'Scegli tu il numero che piu' ti piace
   'Ci facciamo dire quanti byte servono per la struttura
   GetPrinter hPrinter, 2, ByVal 0, 0, Needed
   'Dimensioniamo il buffer
   ReDim Buffer(Needed \ 4) As Long
   'Ci facciamo dare le informazioni sulla stampante
   GetPrinter hPrinter, 2, Buffer(0), Needed, Needed
   'Chiudiamo la stampante
   ClosePrinter hPrinter
   'Restituiamo il valore
   StatoStampante = Buffer(18)
 
End Function
</CODE>
Ciao



corro...!!
grazie
MarioH