![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить имя принтера [D6, WinXP]
ZHK © (2004-04-30 09:56:00)Заранее прошу прощения, если я испльзую неверную терминологию, но пусть простят меня глаза искушенного WINAPI-ста. Как у любого устройства в Винде, у принтера существует два идентификатора - название (например, "Основной принтер") и имя, например \\server\hp-1170. Господа, подскажите, как получить имя, в том числе и сетевое. Насколько я понял, если вызвать функцию:
GetPrinter(PrinterHandle,2,@PRINTER_INFO_2,SizeOf(PRINTER_INFO_2),Need),
то в PRINTER_INFO_2.pShareName я и получу желаемое. Причем Need, по идее, должно тоже равняться SizeOf(PRINTER_INFO_2). Если это все правильно, то осталось получить хендл активного принтера, что я, похоже, сделать пока не могу. Может кто умеет? Буду надеяться на помощь!
ZHK (2004-04-30 12:58:00) [1]А вот такой вариант функции работает интереснее. По-крайней мере и меня получилось то, что я задумал:
Function GetDefaultPrinterNameA(APrinterName:String): String;
var
epNeeded: Cardinal;
epReturn: Cardinal;
epP, epTmp: PByte;
epCounter: integer;
begin
result:='';
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, nil, 0, epNeeded, epReturn);
GetMem(epP, epNeeded);
epTmp:=epP;
try
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, epP, epNeeded, epNeeded, epReturn);
For epCounter:=0 to epReturn-1 do
begin
if (PPrinterInfo2(epTmp)^.pPrinterName<>nil) and (APrinterName=PPrinterInfo2(epTmp)^.pPrinterName) then
result:=PPrinterInfo2(epTmp)^.pServerName+'\'+PPrinterInfo2(epTmp)^.pShareName;
inc(epTmp, sizeof(TPrinterInfo2));
end;
finally FreeMem(epP, epNeeded); end;
end;
Правда, если вызвать ее следующим образом:
ShowMessage(GetDefaultPrinterA(Printer.Printers[Printer.PrinterIndex]))
Спасибо бармаглоту! :-)
ZHK (2004-04-30 11:34:00) [2]К сожалению эта функция выдает имя в формате "Основной принтер", то есть то, что я могу получить не напрягаясь, используя
Printer.Printers[Prunter.PrinterIndex]...
А мне необходимо другое имя. Ну, например, которое можно подставить в команду COPY.
[lamer]Barmaglot (2004-04-30 10:02:00) [3]
Function GetDefaultPrinterNameA: String;
var
epNeeded: Cardinal;
epReturn: Cardinal;
epP, epTmp: PByte;
epCounter: integer;
begin
result:='';
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 5, nil, 0, epNeeded, epReturn); //для NT заменить 5 на 4
GetMem(epP, epNeeded);
epTmp:=epP;
try
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 5, epP, epNeeded, epNeeded, epReturn);
For epCounter:=0 to epReturn-1 do
begin
if ((PPrinterInfo5(epTmp)^.Attributes and PRINTER_ATTRIBUTE_DEFAULT)<>0) then
result:=PPrinterInfo5(epTmp)^.pPrinterName;
inc(epTmp, sizeof(TPrinterInfo5));
end;
finally FreeMem(epP, epNeeded); end;
end;