Récemment j'ai fait une petite démo avec ceci. Il suffit de mettre un TComboBox
et un TMemo
sur un formulaire et remplacer le code avec ceci:
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.
modifier: suppression de la fonction inutile GetDriverNameByOSPrinterName
BTW: En pName
vous avez le nom du pilote pas le nom de L'imprimante. Le Printername est modifiable dans Windows, donc si vous voulez être sûr, utilisez le nom d'utilisateur de l'imprimante.
Je suis désolé, je devais votre réponse non acceptable. Je ne veux pas passer en revue les informations du conducteur. Parce qu'une imprimante Zebra peut être mappée à un pilote d'imprimante générique/texte seulement. Si je choisis le pilote d'imprimante "Générique/Texte", je voudrais savoir que c'est un Zebra derrière. Désolé. – vIceBerg
.. suite ... Comme lorsque vous connectez une imprimante sous Windows, elle peut détecter quelle imprimante est connectée, même si les pilotes ne sont pas installés. C'est ce que je veux savoir. – vIceBerg
euh ... peut-être que vous pouvez obtenir cette information avec une bibliothèque USB, qui a un événement hotplug ou quelque chose comme ça –