2008-10-16 13 views
10

HP Laserjet 3015를 연결하면 Windows에서 올바른 모델을 감지하고 적절한 드라이버를 설치하려고 시도합니다.델파이에서 프린터 모델을 찾는 방법은 무엇입니까?

연결된 프린터 모델을 어떻게 찾을 수 있습니까? Zebra 프린터는 일반/텍스트 전용 드라이버와 함께 설치할 수 있기 때문에 설치된 프린터 목록을 사용하고 싶지 않습니다.

저는 델파이와 C# 프로그래머입니다. 그래서 어떤 언어로 된 도움말이라도 감사하겠습니다.

답변

2

최근에 나는 이것으로 약간의 데모를 만들었습니다. 그냥 TComboBox과 양식에 TMemo을 넣고이와 코드 교체 :

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. 

편집 : GetDriverNameByOSPrinterName

BTW 불필요한 기능을 제거 : pName 당신이 드라이버의 이름이 아닌의 이름이 프린터. Printername은 Windows에서 변경 가능하므로 반드시 Printerdrivername을 사용하십시오.

+0

을 반환해야합니다. 나는 운전자의 정보를보고 싶지 않다. Zebra 프린터는 일반/텍스트 전용 프린터 드라이버에 매핑 될 수 있기 때문에. "Generic/Text"프린터 드라이버를 선택하면 그 뒤에있는 Zebra라는 것을 알고 싶습니다. 죄송합니다. – vIceBerg

+0

.. 계속 ... Windows에서 프린터를 연결할 때처럼 드라이버가 설치되어 있지 않아도 어떤 프린터가 연결되어 있는지 감지 할 수 있습니다. 그것이 내가 알고 싶은 것입니다. – vIceBerg

+0

uhm ... dunno, 어쩌면 당신은이 정보를 일부 USB-Library로 얻을 수 있습니다. whitch에는 hotplug 이벤트가 있습니다. –

5

당신은 Zebra 프린터에

~HI 

를 보낼 수 있으며, 그것의 모델 번호와 미안, 난 당신의 대답을 수락 취소했다 해요 또한 FW 버전

관련 문제