2008-10-16 4 views
10

Wenn ich meinen HP Laserjet 3015 anschließe, erkennt Windows das richtige Modell und versucht dann, die entsprechenden Treiber zu installieren.Wie erkennt man das Druckermodell in Delphi?

Wie kann ich das Modell der angeschlossenen Drucker erkennen? Ich möchte die Liste der installierten Drucker nicht verwenden, da ein Zebra-Drucker mit einem generischen/reinen Texttreiber installiert werden kann.

Ich bin ein Delphi und C# Programmierer, so dass alle Tipps in jeder Sprache geschätzt werden.

Antwort

2

Kürzlich machte ich eine kleine Demo mit diesem. Einfach ein TComboBox und TMemo in einem Formular und ersetzen Sie den Code mit diesem:

unit Unit1; 

interface 

uses 
    Windows, StdCtrls, Classes, Controls, Forms; 

type 
    TForm1 = class(TForm) 
    ComboBox1: TComboBox; 
    Memo1: TMemo; 
    procedure ComboBox1Change(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses 
    Printers, WinSpool, SysUtils; 

type 
    _DRIVER_INFO_6A = record 
    cVersion: DWORD; 
    pName: PAnsiChar;    
    pEnvironment: PAnsiChar;  
    pDriverPath: PAnsiChar;  
    pDataFile: PAnsiChar;   
    pConfigFile: PAnsiChar;  
    pHelpFile: PAnsiChar;   
    pDependentFiles: PAnsiChar; 
    pMonitorName: PAnsiChar;  
    pDefaultDataType: PAnsiChar; 
    pszzPreviousNames: PAnsiChar; 
    ftDriverDate: TFileTime; 
    dwlDriverVersion: Int64; 
    pszMfgName: PAnsiChar; 
    pszOEMUrl: PAnsiChar; 
    pszHardwareID: PAnsiChar; 
    pszProvider: PAnsiChar; 
    end; 
    TDriverInfo6A = _DRIVER_INFO_6A; 
    PDriverInfo6A = ^TDriverInfo6A; 
    PDriverInfo6 = PDriverInfo6A; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ComboBox1.Items.Assign(Printer.Printers); 
    ComboBox1.ItemIndex := 0; 
    ComboBox1Change(nil); 
end; 

function FileTimeToDateTime(ft: TFileTime): TDateTime; 
var 
    st: TSystemTime; 
    lt: TFileTime; 
begin 
    FillChar(st, SizeOf(st), 0); 
    FillChar(lt, SizeOf(lt), 0); 
    FileTimeToLocalFileTime(ft, lt); 
    FileTimeToSystemTime(lt, st); 
    result := SystemTimeToDateTime(st); 
end; 

procedure TForm1.ComboBox1Change(Sender: TObject); 
var 
    hPrinter: THandle; 
    PrtName: String; 
    DriverInfo: PDriverInfo6; 
    dwNeeded: DWORD; 
begin 
    Memo1.Clear; 
    PrtName := Combobox1.Text; 
    OpenPrinter(PChar(PrtName), hPrinter, nil); 
    DriverInfo := nil; 
    try 
    GetPrinterDriver(hPrinter, nil, 6, DriverInfo, 0, dwNeeded); 
    GetMem(DriverInfo, dwNeeded); 
    try 
     if GetPrinterDriver(hPrinter, nil, 6, DriverInfo, dwNeeded, dwNeeded) then begin 
     Memo1.Lines.Add('cVersion: ' + IntToStr(DriverInfo.cVersion)); 
     Memo1.Lines.Add('pName: '+StrPas(DriverInfo.pName)); 
     Memo1.Lines.Add('pEnvironment: '+StrPas(DriverInfo.pEnvironment)); 
     Memo1.Lines.Add('pDriverPath: '+StrPas(DriverInfo.pDriverPath)); 
     Memo1.Lines.Add('pDataFile: '+StrPas(DriverInfo.pDataFile)); 
     Memo1.Lines.Add('pConfigFile: '+StrPas(DriverInfo.pConfigFile)); 
     Memo1.Lines.Add('pHelpFile: '+StrPas(DriverInfo.pHelpFile)); 
     Memo1.Lines.Add('pDependentFiles: '+StrPas(DriverInfo.pDependentFiles)); 
     Memo1.Lines.Add('pMonitorName: '+StrPas(DriverInfo.pMonitorName)); 
     Memo1.Lines.Add('pDefaultDataType: '+StrPas(DriverInfo.pDefaultDataType)); 
     Memo1.Lines.Add('pszzPreviousNames: '+StrPas(DriverInfo.pszzPreviousNames)); 
     Memo1.Lines.Add('ftDriverDate: '+DateTimeToStr(FileTimeToDateTime(DriverInfo.ftDriverDate))); 
     Memo1.Lines.Add('dwlDriverVersion: '+IntToStr(DriverInfo.dwlDriverVersion)); 
     Memo1.Lines.Add('pszMfgName: '+StrPas(DriverInfo.pszMfgName)); 
     Memo1.Lines.Add('pszOEMUrl: '+StrPas(DriverInfo.pszOEMUrl)); 
     Memo1.Lines.Add('pszHardwareID: '+StrPas(DriverInfo.pszHardwareID)); 
     Memo1.Lines.Add('pszProvider: '+StrPas(DriverInfo.pszProvider)); 
     end else 
     Memo1.Lines.Add('No Info needed = ' + IntToStr(dwNeeded)); 
    finally 
     FreeMem(DriverInfo); 
    end; 
    finally 
    ClosePrinter(hPrinter); 
    end; 
end; 

end. 

edit: entfernt die unnötige Funktion GetDriverNameByOSPrinterName

BTW: In pName Sie den Namen des Treibers haben nicht den Namen der Drucker. Der Druckername ist in Windows änderbar. Wenn Sie also sicher gehen möchten, verwenden Sie den Druckertreibernamen.

+0

Es tut mir leid zurückkehren, ich Ihre Antwort unaccept musste. Ich möchte nicht die Fahrerinfos durchgehen. Weil ein Zebra-Drucker einem allgemeinen/Nur-Text-Druckertreiber zugeordnet werden kann. Wenn ich den "Allgemein/Text" Druckertreiber wähle, würde ich gerne wissen, dass es ein Zebra dahinter ist. Entschuldigung. – vIceBerg

+0

.. Fortsetzung ... Wie wenn Sie einen Drucker in Windows anschließen, kann es erkennen, welcher Drucker eingesteckt ist, auch wenn die Treiber nicht installiert sind. Das will ich wissen. – vIceBerg

+0

ähm ... weiß ich nicht, vielleicht kannst du diese Information mit einer USB-Library bekommen, die einen Hotplug-Event hat oder so ähnlich –

5

können Sie einen

~HI 

an den Zebra-Drucker senden, und es sollte seine Modellnummer und auch fw Version