Recientemente hice una pequeña demostración con esto. Sólo hay que poner un TComboBox
y una TMemo
en un formulario y reemplace el código con lo siguiente:
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.
de edición: se ha eliminado la función innecesaria GetDriverNameByOSPrinterName
Por cierto: En pName
usted tiene el nombre del controlador no el nombre del la impresora. El nombre de la impresora es modificable en Windows, por lo que si quiere asegurarse, use el nombre del controlador de la impresora.
Lo siento, tuve que inaceptables desde su respuesta. No quiero consultar las informaciones del conductor. Porque una impresora Zebra se puede asignar a un controlador de impresora genérico/solo de texto. Si selecciono el controlador de impresora "Genérico/Texto", me gustaría saber que detrás está una Zebra. Lo siento. – vIceBerg
.. continúa ... Al igual que cuando conecta una impresora en Windows, puede detectar qué impresora está tapada, incluso si los controladores no están instalados. Eso es lo que quiero saber. – vIceBerg
uhm ... no sé, tal vez pueda obtener esta información con alguna biblioteca USB, que tenga un evento hotplug o algo como esto –