Newsgroup: it.comp.lang.delphi
Titolo: Problema nomi completi stampanti

Mi serve un modo per avere il nome completo di una stampante, specie in 
ambiente Win 32.
Questo perche' quando voglio cambiare da OLE la stampante attiva di 
word, utilizzando la proprieta' ActivePrinter mi accetta solo i nomi 
completi.
Mi spiego meglio :
se dall'oggetto Printer estratto una stampante (esempio Printer.Printers
[1]) mi restituisce un qualcosa tipo "Laserjet 4"
se invece voglio ottenere qualcosa con la OLE di word, devo passargli il 
nome completo, come appare nella configurazione, cioe' "Laserjet 4 on 
NE04:"
Qualcuno sa come ottenere il nome completo dalle API ? O anche mediante 
Ole ?
Ho cercato di tutto, ho provato con la EnumPrinter del winspool ma 
niente.
Ciao.Alberto.
-- 
Alberto Rubinelli - A2 SISTEMI               posted with Gravity 2.60b
Via Costantino Perazzi 22 - 28100 NOVARA (NO) - ITALY     ICQ 49872318
E-Mail : 
alb...@retrocomputing.net
  Tel. 0321 640149 
Web    : 
www.retrocomputing.net
      Fax  0321 391669 BBS  0321 392320

io ho xp e una stampante in lan e sul nome non mi compare "on xxxx".
Che os usi?
A

 Che os usi?
Uso 2000, ma non e' il nome che compare. Lo vedi se fai una OLE con word 
(o altra appl. microsoft) e chiedi ad esempio la stampante attiva con la 
proprieta' ActivePrinter.


 wrote:
x applicazioni CLX 
uses QT 
QPrinter_PrinterName(QprinterH(PrintAdapter.Handle),PWideString(@PrinterName));
se ti serve per VCL non so
Ciao,
Eugenio.
 

 QPrinter_PrinterName(QprinterH(PrintAdapter.Handle),PWideString(@PrinterName));
Puoi essere piu' dettagliato ? Cosa e' QT ? Dove trovo info ?
Grazie Eugenio !


Puoi essere piu' dettagliato ? Cosa e' QT ? Dove trovo info ?
Qt e' il nome di una unit presente da D6 in poi 
QPrinter_PrinterName( fa riferimento ad una funzione external
probabilmente presente qtintf.dll.
E' la libreria grafica alternativa alla vcl per applicazioni 
cross platform delphi >kylix.
Anche a me serviva il nome esatto del driver di stampa
per accodare dei file di testo alla coda di una stampante
specifica.
Ho una soluzione per clx ma non per vcl.
Se non sbaglio si tratta del nome del file-driver di stampa
visibile nella cartella stampanti...con il nome nel formato :
nome stampante su porta
Con la vcl non saprei cosa usare magari domani ci do'
una occhiata...
Ciao, :-)
Eugenio.
 
 

 nome stampante su porta
Esatto ! Proprio questo.
Grazie infinite per l'aiuto !


uso AutoPrint, un programmino che non costa poco ma perfetto.
L'ho fatto prima per stampare su stampanti ad aghi
con delphi poi per stampare su winprinter e su Usb 
da clipper
 
Ciao,
Fammi sapere, ho la rete locale in panne
e non posso vedere i risultati corretti.

 wrote:
Oppure prova cosi' :
procedure TForm1.Button1Click(Sender: TObject);
var
  AdeviceMode : Thandle;
      Adevice : array[0..255] of char;
        APort : array[0..255] of char;
      ADriver : array[0..255] of char;
       PDmode : PdevMode;
        pname : String;
begin
  if printdialog1.execute then begin
     printer.getprinter(Adevice, Adriver, Aport, AdeviceMode);
     if AdeviceMode<>0 then begin
        PDmode:=GlobalLock(AdeviceMode);
        Pname:=PDmode^.dmDeviceName;
        GlobalUnLock(AdeviceMode);
        showmessage(Pname);
     end;
  end;
end;
 Ciao,
Eugenio.

 Oppure prova cosi' :
Niente da fare : con la prima procedura, come risultato ottengo, 
rispettivamente per i 3 showmessage
- nome della stampante abituale (esempio \\server\hp laserjet 4)
- vuoto
- nome della stampante come punto 1
Nel secondo caso invece ottengo sempre e solo il nome della stampante, 
solo che ho notato che me lo tronca se e' piu' lungo di un tot, devo 
misurare quanto.
Grazie infinite per il tuo aiuto !


 wrote:
Ci ho provato in diversi modi ma piu' di questo
non e' venuto fuori.
Non fidarti troppo l'ho fatta in fretta...
:-)
Ciao,
Eugenio.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSpool, Printers ;
type
  TForm1 = class(TForm)
    Button1: TButton;
    PrintDialog1: TPrintDialog;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function GetPrinters: TStrings;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
var
 FPrinters:TStringList;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
 printername : String;
begin
 if printdialog1.execute then begin
    printername:=GetPrinters[Printer.PrinterIndex];
    showmessage(printername);
 end;
end;
function  TForm1.GetPrinters: TStrings;
var
  Buffer, PrinterInfo: PChar;
  Flags, Count, NumInfo: DWORD;
  I : integer;
begin
  if FPrinters = nil then
  begin
    FPrinters := TStringList.Create;
    Result := FPrinters;
    try
      Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
      Count := 0;
      EnumPrinters(Flags, nil, 2, nil, 0, Count, NumInfo);
      if Count = 0 then Exit;
      GetMem(Buffer, Count);
      try
        if not EnumPrinters(Flags, nil, 2 , PByte(Buffer), Count, Count, NumInfo) then
          Exit;
        PrinterInfo := Buffer;
        for I := 0 to NumInfo - 1 do begin
          with PPrinterInfo2(PrinterInfo)^ do begin
               FPrinters.Add(pprintername+' on '+pportname);
               Inc(PrinterInfo, sizeof(TPrinterInfo2));
          end;
        end;
      finally
        FreeMem(Buffer, Count);
      end;
    except
      FPrinters.Free;
      FPrinters := nil;
      raise;
    end;
  end;
  Result := FPrinters;
end;
 

 non e' venuto fuori.
Ho provato anche questa versione, ma in pratica il risultato e' questo:
\\a2sistemi\coda xerox docuprint N17 on \\a2sistemi\coda xerox docuprint 
N17
In pratica sembra che per lui la porta sia il nome stesso.
Io come sistema artigianale, anzi direi di piu', bovino ho trovato 
questo :
- salvo il nome della stampante predefinita
- setto la stampante della quale voglio sapere il nome stile word come 
predefinita
- apro una OLE a word
- leggo la stampante attiva con ActivePrinter
- chiudo tutto
- rimetto a posto la stampante predefinita
ma una cosa del genere non potrei mai distribuirla, e' a dir poco 
vergognosa :))


In pratica sembra che per lui la porta sia il nome stesso.
l'ho provato solo con stampanti locali perche' ho ancora
un problema con la mia rete.
Con quelle locali a me funzionava, non so se dipende
dalla versione di windows.
Cmq hanno fatto un bel casotto e alla fine in quel mare
di Printer_info per pescare il nome della stampante bisogna
fare salti mortali.
Spero  vada meglio alla prossima
Ciao,
:-)
Eugenio.
 

 fare salti mortali.
Infatti, poi come se non bastasse alcune funzioni da quanto ho visto non 
sono importate nella unit di interfaccia alle api dello spooler.
Grazie ancora !!


 wrote:
Ho scoperto che le info sulle stampanti sono tutte nel registry di sistema.
Se fai una ricerca con il nome della stampante le trovi tutte li'.
io le ho trovate in 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\
ogni chiave contiene un dato e naturalmente c'e' anche il nome della porta.
Che poi ci sia o no un modo facile per leggerle da li'
e' un'altra storia ma sapere dove sono forse aiuta.
:-)
Ciao,
Eugenio.
 

 ogni chiave contiene un dato e naturalmente c'e' anche il nome della porta.
Ok, parto immediatamente a lavorare in questa direzione !
Grazie intanto !
